MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

mgo - o desempenho da consulta parece consistentemente lento (500-650ms)


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