Това не е начинът, по който съхранявате и използвате MongoDB връзка в Go.
Трябва да съхраните mgo.Session
, а не mgo.Database
екземпляр. И всеки път, когато трябва да взаимодействате с MongoDB, вие придобивате копие или клонинг на сесията (например с Session.Copy()
или Session.Clone()
) и го затваряте, когато не ви е нужен (за предпочитане с помощта на defer
изявление). Това ще гарантира, че няма да пропуснете връзки.
Вие също религиозно пропуснете проверката за грешки, моля, не правете това. Каквото и да връща error
, проверете го и действайте правилно (най-малкото, което можете да направите, е да го отпечатате/регистрирате).
Така че основно това, което трябва да направите, е нещо подобно:
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
}
Вижте свързани въпроси:
mgo – производителността на заявката изглежда постоянно бавна (500-650ms)
Паралелност в gopkg.in/mgo.v2 (Mongo, Go)