Proponuję nie używać takiej sesji globalnej. Zamiast tego możesz utworzyć typ, który jest odpowiedzialny za całą interakcję z bazą danych. Na przykład:
type DataStore struct {
session *mgo.Session
}
func (ds *DataStore) ucol() *mgo.Collection { ... }
func (ds *DataStore) UserExist(user string) bool { ... }
Ten projekt ma wiele zalet. Ważnym jest to, że pozwala to mieć wiele sesji w locie w tym samym czasie, więc jeśli masz na przykład obsługę http, możesz utworzyć sesję lokalną, która jest wspierana przez niezależną sesję tylko dla tego jednego żądania:
func (s *WebSite) dataStore() *DataStore {
return &DataStore{s.session.Copy()}
}
func (s *WebSite) HandleRequest(...) {
ds := s.dataStore()
defer ds.Close()
...
}
W takim przypadku sterownik mgo zachowuje się ładnie, ponieważ sesje są wewnętrznie buforowane i ponownie używane/utrzymywane. Każda sesja będzie również wspierana przez niezależne gniazdo podczas używania i może mieć skonfigurowane niezależne ustawienia, a także będzie mieć niezależną obsługę błędów. Są to problemy, z którymi w końcu będziesz musiał się uporać, jeśli korzystasz z jednej sesji globalnej.