そのようなグローバルセッションは使用しないことをお勧めします。代わりに、すべてのデータベースの相互作用を担当するタイプを作成できます。例:
type DataStore struct {
session *mgo.Session
}
func (ds *DataStore) ucol() *mgo.Collection { ... }
func (ds *DataStore) UserExist(user string) bool { ... }
その設計には多くの利点があります。重要なのは、同時に複数のセッションを実行できることです。たとえば、httpハンドラーがある場合は、その1つのリクエストに対してのみ独立したセッションに基づくローカルセッションを作成できます。
func (s *WebSite) dataStore() *DataStore {
return &DataStore{s.session.Copy()}
}
func (s *WebSite) HandleRequest(...) {
ds := s.dataStore()
defer ds.Close()
...
}
この場合、セッションは内部的にキャッシュされ、再利用/維持されるため、mgoドライバーは適切に動作します。各セッションは、使用中に独立したソケットによってバックアップされ、独立した設定が構成されている場合があり、独立したエラー処理もあります。これらは、単一のグローバルセッションを使用している場合に最終的に対処しなければならない問題です。