sql >> Databáze >  >> NoSQL >> MongoDB

mgo - výkon dotazu se zdá trvale pomalý (500-650 ms)

.. je něco zřejmého, co by naznačovalo, proč mají mé dotazy v průměru 500–650 ms?

Ano, tam je. Voláte mgo.Dial() před provedením každého dotazu. mgo.Dial() se musí pokaždé připojit k serveru MongoDB, který zavřete hned po dotazu. Navázání spojení může velmi pravděpodobně trvat stovky milisekund, včetně autentizace, alokace zdrojů (jak na straně serveru, tak na straně klienta) atd. To je velmi plýtvání.

Tato metoda se pro daný cluster obecně volá pouze jednou. Další relace do stejného klastru jsou pak vytvořeny pomocí metod New nebo Copy na získané relaci. Díky tomu budou sdílet základní cluster a vhodně spravovat fond připojení.

Vytvořte globální proměnnou relace, připojte se při spuštění jednou (pomocí např. balíčku init() funkci) a použít tuto relaci (nebo její kopii/klon získaný pomocí Session.Copy() nebo Session.Clone() ).Například:

var session *mgo.Session
var info *db.Inf // Use your type here

func init() {
    var err error
    if info, err = db.Info(); err != nil {
        log.Fatal(err)
    }
    if session, err = mgo.Dial(info.ConnectionString()); err != nil {
        log.Fatal(err)
    }
}

func (r userRepo) GetUserByID(id string) (User, error) {
    sess := session.Clone()
    defer sess.Close()

    // Now we use sess to execute the query:
    var user User
    c := sess.DB(info.Db()).C("users")
    // Rest of the method is unchanged...
}



  1. Klient C#/.NET pro Redis

  2. Proč se data ukládají pomocí podivných klíčů v Redis při použití Jedis s Spring Data?

  3. Jak provést vložení, pokud neexistuje jiná aktualizace pomocí mongoengine?

  4. Automatizace a správa open source databází v cloudu – oznámení ClusterControl 1.6