Ini bukan cara Anda menyimpan dan menggunakan koneksi MongoDB di Go.
Anda harus menyimpan mgo.Session
, bukan mgo.Database
contoh. Dan kapan pun Anda perlu berinteraksi dengan MongoDB, Anda memperoleh salinan atau tiruan sesi (mis. dengan Session.Copy()
atau Session.Clone()
), dan Anda menutupnya saat tidak diperlukan (sebaiknya menggunakan defer
penyataan). Ini akan memastikan Anda tidak membocorkan koneksi.
Anda juga religius menghilangkan memeriksa kesalahan, tolong jangan lakukan itu. Apa pun yang mengembalikan error
, periksa dan lakukan dengan benar (paling tidak yang dapat Anda lakukan adalah mencetak / mencatatnya).
Jadi pada dasarnya yang perlu Anda lakukan adalah seperti ini:
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
}
Lihat pertanyaan terkait:
mgo - kinerja kueri tampaknya selalu lambat (500-650 md)
Konkurensi di gopkg.in/mgo.v2 (Mongo, Go)