mgo.Session
är säker för samtidig användning. Citerar från dess dokument:
Alla sessionsmetoder är samtidighetssäkra och kan anropas från flera goroutiner.
Men det betyder inte att du inte ska skapa och använda fler av dem parallellt genom att anropa Session.Copy()
eller Session.Clone()
, på den första sessionen som erhölls vid uppringningstid.
Att vara samtidighetssäkra och ha nytta av att använda fler av dem utesluter inte varandra (de är inte ömsesidigt uteslutande ). Även om du kan använda en enda mgo.Session
från godtyckligt antal goroutiner, som inte kommer att skala bra, som inte kommer att skala alls . Sessioner hanterar automatiskt en pool av anslutningar, kanske till och med till flera servernoder, men om du använder en enda Session
, du utnyttjar inte det. Genom att skapa en ny Session
i början av varje förfrågan (om det behövs) och stäng den ordentligt i slutet (med Session.Close()
; anropas helst med defer
), drar du fördel av att potentiellt använda flera anslutningar samtidigt, möjligen till flera servernoder (om tillgängliga), och därmed bättre utnyttja serverresurserna; och få snabbare svarstider (både från databasen och i slutändan till dina HTTP-slutanvändare). Anropar Session.Close()
stänger inte den underliggande anslutningen till servern, den kommer bara att återställa anslutningen till poolen, redo att hämtas av en annan session.
Se även relaterad fråga om användningen av Session
s:mgo - frågeprestanda verkar konsekvent långsam (500-650 ms)