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