MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

mgo - les performances des requêtes semblent constamment lentes (500-650 ms)

.. y a-t-il quelque chose d'évident qui suggérerait pourquoi mes requêtes sont en moyenne de 500 à 650 ms ?

Oui il y a. Vous appelez mgo.Dial() avant d'exécuter chaque requête. mgo.Dial() doit se connecter au serveur MongoDB à chaque fois, que vous fermez juste après la requête. La connexion peut très probablement prendre des centaines de millisecondes pour s'établir, y compris l'authentification, l'allocation des ressources (à la fois côté serveur et côté client), etc. C'est très inutile.

Cette méthode est généralement appelée une seule fois pour un cluster donné. D'autres sessions sur le même cluster sont ensuite établies à l'aide des méthodes New ou Copy sur la session obtenue. Cela leur permettra de partager le cluster sous-jacent et de gérer le pool de connexions de manière appropriée.

Créez une variable de session globale, connectez-vous au démarrage une fois (en utilisant par exemple un package init() function), et utiliser cette session (ou une copie/clone de celle-ci, obtenue par Session.Copy() ou Session.Clone() ).Par exemple :

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