MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Best practice per mantenere una sessione di Mgo

Suggerisco di non utilizzare una sessione globale del genere. È invece possibile creare un tipo responsabile di tutte le interazioni con il database. Ad esempio:

type DataStore struct {
    session *mgo.Session
}

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

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

Ci sono molti vantaggi in questo design. Un aspetto importante è che ti consente di avere più sessioni in volo contemporaneamente, quindi se hai un gestore http, ad esempio, puoi creare una sessione locale supportata da una sessione indipendente solo per quella richiesta:

func (s *WebSite) dataStore() *DataStore {
    return &DataStore{s.session.Copy()}
}    

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

Il driver mgo si comporta bene in tal caso, poiché le sessioni vengono memorizzate nella cache interna e riutilizzate/mantenute. Ogni sessione sarà inoltre supportata da un socket indipendente durante l'uso, potrebbe avere impostazioni indipendenti configurate e avrà anche una gestione degli errori indipendente. Questi sono problemi che alla fine dovrai affrontare se stai utilizzando una singola sessione globale.