mgo.Session
е безопасен за едновременна употреба. Цитирам от неговия документ:
Всички методи на сесията са безопасни за паралелност и могат да бъдат извикани от множество горпрограми.
Но това не означава, че не трябва да създавате и използвате повече от тях паралелно, като извикате Session.Copy()
или Session.Clone()
, при първоначалната сесия, получена по време на набиране.
Да бъдеш безопасен за едновременност и да се възползваш от използването на повече от тях, не се изключват взаимно (те не са взаимно изключващи се ). Докато можете да използвате единична mgo.Session
от произволен брой горпрограми, които няма да мащабират добре, които няма да мащабират изобщо . Сесиите автоматично управляват набор от връзки, може би дори към множество сървърни възли, но ако използвате една Session
, ти не се възползваш от това. Чрез създаване на нова Session
в началото на всяка ваша заявка (ако е необходимо) и правилното й затваряне в края (с Session.Close()
; за предпочитане се извиква чрез defer
), се възползвате от потенциалното използване на множество връзки едновременно, вероятно към множество сървърни възли (ако има такива), и по този начин по-добре да използвате сървърните ресурси; и получаване на по-бързо време за реакция (както от базата данни, така и в крайна сметка до вашите HTTP крайни потребители). Извикване на Session.Close()
не затваря основната връзка със сървъра, просто ще върне връзката обратно към пула, готова да бъде взета от друга сесия.
Вижте също свързан въпрос относно използването на Session
s:mgo - производителността на заявката изглежда постоянно бавна (500-650ms)