MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Melhor prática para manter uma sessão mgo


Sugiro não usar uma sessão global como essa. Em vez disso, você pode criar um tipo responsável por toda a interação do banco de dados. Por exemplo:
type DataStore struct {
    session *mgo.Session
}

func (ds *DataStore) ucol() *mgo.Collection { ... }

func (ds *DataStore) UserExist(user string) bool { ... }

Há muitos benefícios para esse design. Um importante é que ele permite que você tenha várias sessões em andamento ao mesmo tempo, portanto, se você tiver um manipulador http, por exemplo, poderá criar uma sessão local que seja apoiada por uma sessão independente apenas para essa solicitação:
func (s *WebSite) dataStore() *DataStore {
    return &DataStore{s.session.Copy()}
}    

func (s *WebSite) HandleRequest(...) {
    ds := s.dataStore()
    defer ds.Close()
    ...
}

O driver mgo se comporta bem nesse caso, pois as sessões são armazenadas em cache internamente e reutilizadas/mantidas. Cada sessão também será apoiada por um soquete independente durante o uso e poderá ter configurações independentes configuradas e também terá tratamento de erros independente. Esses são problemas com os quais você terá que lidar se estiver usando uma única sessão global.