MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

trop de fichiers ouverts sur le serveur mgo go

Ce n'est pas ainsi que vous stockez et utilisez une connexion MongoDB dans Go.

Vous devez stocker un mgo.Session , pas un mgo.Database exemple. Et chaque fois que vous avez besoin d'interagir avec la MongoDB, vous acquérez une copie ou un clone de la session (par exemple avec Session.Copy() ou Session.Clone() ), et vous le fermez quand vous n'en avez pas besoin (de préférence en utilisant un defer déclaration). Cela vous assurera de ne pas fuir les connexions.

Vous aussi religieusement omettez de vérifier les erreurs, veuillez ne pas le faire. Tout ce qui renvoie une error , vérifiez-le et agissez correctement (le moins que vous puissiez faire est de l'imprimer / de l'enregistrer).

Donc, fondamentalement, ce que vous devez faire est quelque chose comme ceci :

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
}

Voir les questions associées :

mgo - les performances des requêtes semblent constamment lentes (500-650 ms)

Concurrence dans gopkg.in/mgo.v2 (Mongo, Go)