sql >> Base de Datos >  >> NoSQL >> MongoDB

demasiados archivos abiertos en el servidor mgo go

No es así como almacena y usa una conexión MongoDB en Go.

Tienes que almacenar una mgo.Session , no un mgo.Database instancia. Y siempre que necesite interactuar con MongoDB, adquiere una copia o un clon de la sesión (por ejemplo, con Session.Copy() o Session.Clone() ), y lo cierras cuando no lo necesitas (preferiblemente usando un defer declaración). Esto asegurará que no haya fugas en las conexiones.

También religiosamente omita la verificación de errores, por favor no haga eso. Lo que sea que devuelva un error , verifíquelo y actúe en consecuencia (lo menos que puede hacer es imprimirlo/registrarlo).

Entonces, básicamente, lo que debes hacer es algo como esto:

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
}

Ver preguntas relacionadas:

mgo:el rendimiento de las consultas parece ser constantemente lento (500-650 ms)

Concurrencia en gopkg.in/mgo.v2 (Mongo, Go)