sql >> Databasteknik >  >> NoSQL >> MongoDB

för många öppna filer i mgo go-servern

Det är inte så du lagrar och använder en MongoDB-anslutning i Go.

Du måste lagra en mgo.Session , inte en mgo.Database exempel. Och närhelst du behöver interagera med MongoDB, skaffar du en kopia eller en klon av sessionen (t.ex. med Session.Copy() eller Session.Clone() ), och du stänger den när du inte behöver den (helst med en defer påstående). Detta säkerställer att du inte läcker anslutningar.

Du också religiöst utelämna felsökning, gör inte det. Vad som än returnerar ett error , kontrollera det och agera efter det ordentligt (det minsta du kan göra är att skriva ut / logga det).

Så i princip vad du behöver göra är något sånt här:

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
}

Se relaterade frågor:

mgo - frågeprestanda verkar konsekvent långsam (500-650 ms)

Samtidighet i gopkg.in/mgo.v2 (Mongo, Go)



  1. Visuell hantering av MongoDB-dokument och samlingar

  2. Frågar med mangust och dadlar

  3. redis bgsave misslyckades eftersom gaffeln inte kan allokera minne

  4. Hur man sammanfogar strängar i SQL