sql >> Databasteknik >  >> NoSQL >> MongoDB

mgo - frågeprestanda verkar konsekvent långsam (500-650ms)

.. finns det något uppenbart som tyder på varför mina frågor är i genomsnitt 500-650 ms?

Ja, det finns. Du anropar mgo.Dial() innan du utför varje fråga. mgo.Dial() måste ansluta till MongoDB-servern varje gång, som du stänger direkt efter frågan. Anslutningen kan med stor sannolikhet ta hundratals millisekunder att upprätta, inklusive autentisering, allokering av resurser (både på server- och klientsidan), etc. Detta är mycket slöseri.

Denna metod kallas vanligtvis bara en gång för ett givet kluster. Ytterligare sessioner till samma kluster upprättas sedan med hjälp av metoderna Ny eller Kopiera på den erhållna sessionen. Detta kommer att få dem att dela det underliggande klustret och hantera poolen av anslutningar på lämpligt sätt.

Skapa en global sessionsvariabel, anslut vid start en gång (med t.ex. ett paket init() funktion), och använd den sessionen (eller en kopia/klon av den, erhållen av Session.Copy() eller Session.Clone() ).Till exempel:

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. Vad är användningen av filen mongo.lock?

  2. Styre:Åtkomst har nekats att lösa egendomen från eftersom det inte är en egen egendom för sin förälder

  3. Kontrollera om ett index finns i mongodb

  4. Återställ en MongoDB-databas med mongorestore