MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Zu viele offene Dateien auf dem mgo go-Server

So speichern und verwenden Sie keine MongoDB-Verbindung in Go.

Sie müssen eine mgo.Session speichern , keine mgo.Database Beispiel. Und wann immer Sie mit der MongoDB interagieren müssen, erwerben Sie eine Kopie oder einen Klon der Sitzung (z. B. mit Session.Copy() oder Session.Clone() ), und Sie schließen es, wenn Sie es nicht benötigen (vorzugsweise mit einem defer Erklärung). Dadurch wird sichergestellt, dass keine Verbindungen lecken.

Sie auch religiös Unterlassen Sie die Überprüfung auf Fehler, tun Sie dies bitte nicht. Was auch immer einen error zurückgibt , überprüfen Sie es und handeln Sie entsprechend (das Mindeste, was Sie tun können, ist es auszudrucken / zu protokollieren).

Was Sie also im Grunde tun müssen, ist ungefähr Folgendes:

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
}

Siehe verwandte Fragen:

mgo - Abfrageleistung scheint konstant langsam zu sein (500-650 ms)

Parallelität in gopkg.in/mgo.v2 (Mongo, Go)