MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

za dużo otwartych plików na serwerze mgo go

Nie tak przechowujesz i używasz połączenia MongoDB w Go.

Musisz przechowywać mgo.Session , a nie mgo.Database instancja. Za każdym razem, gdy musisz wejść w interakcję z MongoDB, uzyskujesz kopię lub klon sesji (np. za pomocą Session.Copy() lub Session.Clone() ) i zamykasz go, gdy go nie potrzebujesz (najlepiej używając defer oświadczenie). Zapewni to, że nie przeciekasz połączeń.

Ty też religijnie pomiń sprawdzanie błędów, nie rób tego. Cokolwiek zwraca error , sprawdź go i postępuj zgodnie z nim (co najmniej, co możesz zrobić, to wydrukować/zalogować).

Więc zasadniczo to, co musisz zrobić, to coś takiego:

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
}

Zobacz powiązane pytania:

mgo - wydajność zapytań wydaje się stale niska (500-650 ms)

Współbieżność w gopkg.in/mgo.v2 (Mongo, Go)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. XFS vs EXT4 — porównanie wydajności MongoDB na AWS EC2

  2. Jak skopiować kolekcję z jednej bazy danych do drugiej w MongoDB?

  3. Sprawdzanie, czy pole zawiera ciąg

  4. Jedna publikacja ukrywa zagnieżdżone pola z innej publikacji

  5. MongoDB kontra Cassandra