mgo.Session jest bezpieczny do równoczesnego użytku. Cytując z jego dokumentu:
Wszystkie metody sesji są bezpieczne dla współbieżności i mogą być wywoływane z wielu gorutyn.
Ale to nie znaczy, że nie powinieneś tworzyć i używać więcej z nich równolegle, wywołując Session.Copy() lub Session.Clone() , w początkowej sesji uzyskanej podczas wybierania numeru.
Zapewnienie bezpieczeństwa dla współbieżności i czerpanie korzyści z używania większej liczby z nich nie wyklucza się nawzajem (nie wykluczają się wzajemnie ). Chociaż możesz użyć jednego mgo.Session z dowolnej liczby gorutyn, które nie będą się dobrze skalować, które nie będą się skalować w ogóle . Sesje automatycznie zarządzają pulą połączeń, może nawet z wieloma węzłami serwerów, ale jeśli używasz jednej Session , nie wykorzystujesz tego. Tworząc nową Session na początku każdego żądania (jeśli to konieczne) i poprawnie zamykając je na końcu (za pomocą Session.Close(); najlepiej wywoływane przy użyciu defer ), korzystasz z potencjalnego korzystania z wielu połączeń w tym samym czasie, prawdopodobnie z wieloma węzłami serwerów (jeśli są dostępne), a tym samym lepiej wykorzystujesz zasoby serwera; i uzyskanie szybszych czasów odpowiedzi (zarówno z bazy danych, jak i ostatecznie dla użytkowników końcowych HTTP). Wywołanie Session.Close() nie zamyka podstawowego połączenia z serwerem, po prostu przywróci połączenie z powrotem do puli, gotowe do przejęcia przez inną sesję.
Zobacz także powiązane pytanie dotyczące użycia Session s:mgo — wydajność zapytań wydaje się stale niska (500-650 ms)