Non è così che memorizzi e utilizzi una connessione MongoDB in Go.
Devi memorizzare una mgo.Session
, non un mgo.Database
esempio. E ogni volta che devi interagire con MongoDB, acquisisci una copia o un clone della sessione (ad esempio con Session.Copy()
o Session.Clone()
), e lo chiudi quando non ti serve (preferibilmente usando un defer
dichiarazione). Questo ti assicurerà di non perdere le connessioni.
Anche tu religiosamente ometti il controllo degli errori, per favore non farlo. Qualunque cosa restituisca un error
, controllalo e agisci su di esso correttamente (il minimo che puoi fare è stamparlo/registrarlo).
Quindi fondamentalmente quello che devi fare è qualcosa del genere:
var session *mgo.Session
func init() {
var err error
if session, err = mgo.Dial("localhost"); err != nil {
log.Fatal(err)
}
}
func someHandler(w http.ResponseWriter, r *http.Request) {
sess := session.Copy()
defer sess.Close() // Must close!
c := sess.DB("mapdb").C("tiles")
// Do something with the collection, e.g.
var tile bson.M
if err := c.FindId("someTileID").One(&result); err != nil {
// Tile does not exist, send back error, e.g.:
log.Printf("Tile with ID not found: %v, err: %v", "someTileID", err)
http.NotFound(w, r)
return
}
// Do something with tile
}
Vedi le domande correlate:
mgo:le prestazioni delle query sembrano costantemente lente (500-650 ms)
Simultaneità in gopkg.in/mgo.v2 (Mongo, Go)