Det är inte så du lagrar och använder en MongoDB-anslutning i Go.
Du måste lagra en mgo.Session
, inte en mgo.Database
exempel. Och närhelst du behöver interagera med MongoDB, skaffar du en kopia eller en klon av sessionen (t.ex. med Session.Copy()
eller Session.Clone()
), och du stänger den när du inte behöver den (helst med en defer
påstående). Detta säkerställer att du inte läcker anslutningar.
Du också religiöst utelämna felsökning, gör inte det. Vad som än returnerar ett error
, kontrollera det och agera efter det ordentligt (det minsta du kan göra är att skriva ut / logga det).
Så i princip vad du behöver göra är något sånt här:
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
}
Se relaterade frågor:
mgo - frågeprestanda verkar konsekvent långsam (500-650 ms)
Samtidighet i gopkg.in/mgo.v2 (Mongo, Go)