sql >> Database >  >> NoSQL >> MongoDB

te veel open bestanden in mgo go-server

Dit is niet hoe je een MongoDB-verbinding in Go opslaat en gebruikt.

U moet een mgo.Session . opslaan , niet een mgo.Database voorbeeld. En wanneer u met de MongoDB moet communiceren, verkrijgt u een kopie of een kloon van de sessie (bijvoorbeeld met Session.Copy() of Session.Clone() ), en je sluit het wanneer je het niet nodig hebt (bij voorkeur met een defer uitspraak). Dit zorgt ervoor dat je geen verbindingen lekt.

U ook religieus laat het controleren op fouten achterwege, doe dat alstublieft niet. Wat er ook een error retourneert , controleer het en handel er correct naar (het minste wat u kunt doen is het afdrukken / loggen).

Dus eigenlijk moet je zoiets als dit doen:

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
}

Zie gerelateerde vragen:

mgo - queryprestaties lijken constant traag (500-650 ms)

Gelijktijdigheid in gopkg.in/mgo.v2 (Mongo, Go)



  1. Mongodb en MAMP

  2. Een overzicht van MongoDB-gebruikersbeheer

  3. MongoDB:controleer verbinding met DB

  4. Naam van staten op kaart plotten met Node js en D3 in realtime