これは、GoでMongoDB接続を保存して使用する方法ではありません。
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)の同時実行性