Ce n'est pas ainsi que vous stockez et utilisez une connexion MongoDB dans Go.
Vous devez stocker un mgo.Session
, pas un mgo.Database
exemple. Et chaque fois que vous avez besoin d'interagir avec la MongoDB, vous acquérez une copie ou un clone de la session (par exemple avec Session.Copy()
ou Session.Clone()
), et vous le fermez quand vous n'en avez pas besoin (de préférence en utilisant un defer
déclaration). Cela vous assurera de ne pas fuir les connexions.
Vous aussi religieusement omettez de vérifier les erreurs, veuillez ne pas le faire. Tout ce qui renvoie une error
, vérifiez-le et agissez correctement (le moins que vous puissiez faire est de l'imprimer / de l'enregistrer).
Donc, fondamentalement, ce que vous devez faire est quelque chose comme ceci :
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
}
Voir les questions associées :
mgo - les performances des requêtes semblent constamment lentes (500-650 ms)
Concurrence dans gopkg.in/mgo.v2 (Mongo, Go)