.. há algo óbvio que sugira por que minhas consultas estão em média 500-650ms?
Sim existe. Você está chamando
mgo.Dial()
antes de executar cada consulta. mgo.Dial()
tem que se conectar ao servidor MongoDB toda vez, que você fecha logo após a consulta. A conexão pode levar centenas de milissegundos para ser estabelecida, incluindo autenticação, alocação de recursos (tanto no servidor quanto no cliente), etc. Isso é um grande desperdício.
Esse método geralmente é chamado apenas uma vez para um determinado cluster. Sessões adicionais para o mesmo cluster são então estabelecidas usando os métodos New ou Copy na sessão obtida. Isso fará com que eles compartilhem o cluster subjacente e gerenciem o pool de conexões adequadamente.
Crie uma variável de sessão global, conecte na inicialização uma vez (usando, por exemplo, um pacote
init()
função), e use essa sessão (ou uma cópia/clone dela, obtida por Session.Copy()
ou Session.Clone()
).Por exemplo: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...
}