MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

muitos arquivos abertos no servidor mgo go


Não é assim que você armazena e usa uma conexão MongoDB em Go.

Você precisa armazenar um mgo.Session , não um mgo.Database instância. E sempre que você precisar interagir com o MongoDB, você adquire uma cópia ou um clone da sessão (por exemplo, com Session.Copy() ou Session.Clone() ), e você o fecha quando não precisa dele (de preferência usando um defer demonstração). Isso garantirá que você não vaze as conexões.

Você também religiosamente omita a verificação de erros, por favor, não faça isso. O que quer que retorne um error , verifique e aja corretamente (o mínimo que você pode fazer é imprimir/registrar).

Então basicamente o que você precisa fazer é algo assim:
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
}

Veja as perguntas relacionadas:

mgo - o desempenho da consulta parece consistentemente lento (500-650ms)

Simultaneidade em gopkg.in/mgo.v2 (Mongo, Go)