Nie tak przechowujesz i używasz połączenia MongoDB w Go.
Musisz przechowywać mgo.Session
, a nie mgo.Database
instancja. Za każdym razem, gdy musisz wejść w interakcję z MongoDB, uzyskujesz kopię lub klon sesji (np. za pomocą Session.Copy()
lub Session.Clone()
) i zamykasz go, gdy go nie potrzebujesz (najlepiej używając defer
oświadczenie). Zapewni to, że nie przeciekasz połączeń.
Ty też religijnie pomiń sprawdzanie błędów, nie rób tego. Cokolwiek zwraca error
, sprawdź go i postępuj zgodnie z nim (co najmniej, co możesz zrobić, to wydrukować/zalogować).
Więc zasadniczo to, co musisz zrobić, to coś takiego:
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
}
Zobacz powiązane pytania:
mgo - wydajność zapytań wydaje się stale niska (500-650 ms)
Współbieżność w gopkg.in/mgo.v2 (Mongo, Go)