Jeg foreslår, at du ikke bruger en sådan global session. I stedet kan du oprette en type, der er ansvarlig for al databaseinteraktion. For eksempel:
type DataStore struct {
session *mgo.Session
}
func (ds *DataStore) ucol() *mgo.Collection { ... }
func (ds *DataStore) UserExist(user string) bool { ... }
Der er mange fordele ved det design. En vigtig er, at det giver dig mulighed for at have flere sessioner under flyvning på samme tid, så hvis du for eksempel har en http-handler, kan du oprette en lokal session, der understøttes af en uafhængig session kun for den ene anmodning:
func (s *WebSite) dataStore() *DataStore {
return &DataStore{s.session.Copy()}
}
func (s *WebSite) HandleRequest(...) {
ds := s.dataStore()
defer ds.Close()
...
}
Mgo-driveren opfører sig pænt i det tilfælde, da sessioner internt cachelagres og genbruges/vedligeholdes. Hver session vil også blive understøttet af en uafhængig socket, mens den er i brug, og kan have uafhængige indstillinger konfigureret og vil også have uafhængig fejlhåndtering. Dette er problemer, du i sidste ende bliver nødt til at håndtere, hvis du bruger en enkelt global session.