sql >> Database >  >> NoSQL >> MongoDB

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

.. is er iets voor de hand liggends dat suggereert waarom mijn query's gemiddeld 500-650 ms zijn?

Ja dat is er. U belt mgo.Dial() voordat u elke query uitvoert. mgo.Dial() moet elke keer verbinding maken met de MongoDB-server, die u direct na de query sluit. Het kan zeer waarschijnlijk honderden milliseconden duren voordat de verbinding tot stand is gebracht, inclusief authenticatie, het toewijzen van bronnen (zowel aan de server- als aan de clientzijde), enz. Dit is erg verspillend.

Deze methode wordt over het algemeen maar één keer aangeroepen voor een bepaald cluster. Verdere sessies naar hetzelfde cluster worden dan tot stand gebracht met behulp van de New of Copy-methoden op de verkregen sessie. Hierdoor zullen ze het onderliggende cluster delen en de pool van verbindingen op de juiste manier beheren.

Maak een globale sessievariabele, verbind bij opstarten eenmaal (met behulp van bijvoorbeeld een pakket init() functie), en gebruik die sessie (of een kopie / kloon ervan, verkregen door Session.Copy() of Session.Clone() ).Bijvoorbeeld:

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. Meerdere $elemMatch-expressies voor het matchen van arraywaarden met $all in MongoDB?

  2. Redis zrevrangebyscore, sorteren anders dan lexicografische volgorde

  3. Installeer Memcached op Ubuntu 16.04

  4. Parallelle uitvoering met StackExchange.Redis?