.. 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...
}