.. c'è qualcosa di ovvio che suggerisca il motivo per cui i miei querier hanno una media di 500-650 ms?
Si C'è. Stai chiamando mgo.Dial()
prima di eseguire ogni query. mgo.Dial()
deve connettersi ogni volta al server MongoDB, che si chiude subito dopo la query. Molto probabilmente la connessione potrebbe richiedere centinaia di millisecondi per stabilire, inclusa l'autenticazione, l'allocazione delle risorse (sia sul lato server che client), ecc. Questo è molto dispendioso.
Questo metodo viene generalmente chiamato solo una volta per un determinato cluster. Ulteriori sessioni nello stesso cluster vengono quindi stabilite utilizzando i metodi New o Copy sulla sessione ottenuta. Ciò consentirà loro di condividere il cluster sottostante e di gestire il pool di connessioni in modo appropriato.
Crea una variabile di sessione globale, connettiti all'avvio una volta (utilizzando ad esempio un pacchetto init()
funzione) e utilizzare quella sessione (o una copia/clone di essa, ottenuta da Session.Copy()
o Session.Clone()
).Ad esempio:
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...
}