Det er ikke sådan, du gemmer og bruger en MongoDB-forbindelse i Go.
Du skal gemme en mgo.Session
, ikke en mgo.Database
eksempel. Og hver gang du har brug for at interagere med MongoDB, anskaffer du en kopi eller en klon af sessionen (f.eks. med Session.Copy()
eller Session.Clone()
), og du lukker den, når du ikke har brug for den (helst ved at bruge en defer
udmelding). Dette sikrer, at du ikke lækker forbindelser.
Du også religiøst undlad at tjekke for fejl, lad være med at gøre det. Uanset hvad der returnerer en error
, tjek det og handle på det ordentligt (det mindste du kan gøre er at udskrive / logge det).
Så dybest set, hvad du skal gøre er noget som dette:
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 relaterede spørgsmål:
mgo - forespørgselsydeevne virker konsekvent langsom (500-650ms)
Samtidighed i gopkg.in/mgo.v2 (Mongo, Go)