sql >> データベース >  >> NoSQL >> MongoDB

mgoGoサーバーで開いているファイルが多すぎます

    これは、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)の同時実行性



    1. MongoDB:エラー:子プロセスが失敗し、エラー番号14で終了しました

    2. $lookupMongodbのLocalFieldで文字列をobjectIdに変換する方法

    3. 文字列からutf-8以外のすべての記号を削除します

    4. セロリはピアによって接続をリセットします