MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

troppi file aperti nel server mgo go

Non è così che memorizzi e utilizzi una connessione MongoDB in Go.

Devi memorizzare una mgo.Session , non un mgo.Database esempio. E ogni volta che devi interagire con MongoDB, acquisisci una copia o un clone della sessione (ad esempio con Session.Copy() o Session.Clone() ), e lo chiudi quando non ti serve (preferibilmente usando un defer dichiarazione). Questo ti assicurerà di non perdere le connessioni.

Anche tu religiosamente ometti il ​​controllo degli errori, per favore non farlo. Qualunque cosa restituisca un error , controllalo e agisci su di esso correttamente (il minimo che puoi fare è stamparlo/registrarlo).

Quindi fondamentalmente quello che devi fare è qualcosa del genere:

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
}

Vedi le domande correlate:

mgo:le prestazioni delle query sembrano costantemente lente (500-650 ms)

Simultaneità in gopkg.in/mgo.v2 (Mongo, Go)