Ik stel voor om zo'n globale sessie niet te gebruiken. In plaats daarvan kunt u een type maken dat verantwoordelijk is voor alle database-interactie. Bijvoorbeeld:
type DataStore struct {
session *mgo.Session
}
func (ds *DataStore) ucol() *mgo.Collection { ... }
func (ds *DataStore) UserExist(user string) bool { ... }
Dat ontwerp heeft veel voordelen. Een belangrijke is dat je hiermee meerdere sessies tegelijkertijd kunt hebben, dus als je bijvoorbeeld een http-handler hebt, kun je voor dat ene verzoek een lokale sessie maken die wordt ondersteund door een onafhankelijke sessie:
func (s *WebSite) dataStore() *DataStore {
return &DataStore{s.session.Copy()}
}
func (s *WebSite) HandleRequest(...) {
ds := s.dataStore()
defer ds.Close()
...
}
Het mgo-stuurprogramma gedraagt zich in dat geval netjes, omdat sessies intern in de cache worden opgeslagen en opnieuw worden gebruikt / onderhouden. Elke sessie wordt ook ondersteund door een onafhankelijke socket tijdens gebruik, en kan onafhankelijke instellingen hebben geconfigureerd, en zal ook onafhankelijke foutafhandeling hebben. Dit zijn problemen waar u uiteindelijk mee te maken krijgt als u een enkele globale sessie gebruikt.