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)