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

for mange åbne filer i mgo go server

Det er ikke sådan, du gemmer og bruger en MongoDB-forbindelse i Go.

Du skal gemme en mgo.Session , ikke en mgo.Database eksempel. Og hver gang du har brug for at interagere med MongoDB, anskaffer du en kopi eller en klon af sessionen (f.eks. med Session.Copy() eller Session.Clone() ), og du lukker den, når du ikke har brug for den (helst ved at bruge en defer udmelding). Dette sikrer, at du ikke lækker forbindelser.

Du også religiøst undlad at tjekke for fejl, lad være med at gøre det. Uanset hvad der returnerer en error , tjek det og handle på det ordentligt (det mindste du kan gøre er at udskrive / logge det).

Så dybest set, hvad du skal gøre er noget som dette:

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 relaterede spørgsmål:

mgo - forespørgselsydeevne virker konsekvent langsom (500-650ms)

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



  1. Redis leder efter env redis url-variabel ikke sikker på, hvor env-variabelen dårlig URI skal placeres (er ikke URI?):(URI::InvalidURIError)

  2. MongoDB i 2018 - A Year in Review

  3. Redistogo og Sidekiq på Heroku:Kan ikke oprette forbindelse

  4. tilpasset redis-klient kompilering mislykkes