La mgo.Session
è sicuro per l'uso simultaneo. Citando dal suo documento:
Tutti i metodi Session sono sicuri per la concorrenza e possono essere chiamati da più goroutine.
Ma questo non significa che non dovresti crearne e usarne altri in parallelo, chiamando Session.Copy()
o Session.Clone()
, sulla sessione iniziale ottenuta al momento della chiamata.
Essere sicuri per la concorrenza e trarre vantaggio dall'usarne di più non si escludono a vicenda (non si escludono a vicenda ). Sebbene tu possa utilizzare una singola mgo.Session
da un numero arbitrario di goroutine, che non scalerà bene, che non scalerà per niente . Le sessioni gestiscono automaticamente un pool di connessioni, magari anche a più nodi del server, ma se stai usando una singola Session
, non ne stai approfittando. Creando una nuova Session
all'inizio di ogni tua richiesta (se necessario) e chiudendola correttamente alla fine (con Session.Close()
; preferibilmente chiamato usando defer
), stai sfruttando potenzialmente più connessioni contemporaneamente, possibilmente a più nodi del server (se disponibili), e quindi utilizza meglio le risorse del server; e ottenere tempi di risposta più rapidi (sia dal database che, in definitiva, agli utenti finali HTTP). Chiamando Session.Close()
non chiude la connessione sottostante al server, semplicemente rimetterà la connessione al pool, pronta per essere ripresa da un'altra sessione.
Vedi anche la domanda correlata sull'uso di Session
s:mgo - le prestazioni della query sembrano costantemente lente (500-650 ms)