Maison  >  Article  >  développement back-end  >  Pourquoi une simple requête prend-elle plus de 2 secondes avec le pilote Golang Mongo ?

Pourquoi une simple requête prend-elle plus de 2 secondes avec le pilote Golang Mongo ?

王林
王林avant
2024-02-06 09:30:081156parcourir

为什么使用 Golang Mongo 驱动程序执行一个简单的查询需要花费 2 秒以上的时间?

Contenu de la question

J'écris un service Web Golang avec une base de données mongo, j'utilise go.mongodb.org/mongo-driver v1.11.6 et une simple requête prend plus de 2 secondes. La base de données ne contient que quelques enregistrements, juste à des fins de test, pas plus de 10 enregistrements.

Je cherchais la partie du code qui me faisait perdre du temps et j'ai découvert que le problème venait du package mongo. Les méthodes find, findone et même insert et update prennent toutes plus de 1 ou 2 secondes.

C'est l'instanciation du client mongo

func newmongodb() *mongodb {
    uri := config.getenvconfig().mongouri
    database := config.getenvconfig().mongodatabase

    client, err := mongo.connect(context.todo(), options.client().applyuri(uri))

    if err != nil {
    panic(err)
    }

    return &mongodb{
    client:   client,
    database: database,
    }
}

Voici le code de fonction :

func getmessagebyidfromdb(id string) (*message, error) {
    conn := database.newmongodb()
    defer conn.disconnect()

    filter := map[string]string{
    "message_id": id,
    }

    var message message

    start := time.now()

    err := conn.getcollection(collectionname).findone(context.todo(), filter).decode(&message)

    elapsed := time.since(start)
    log.printf("querying messages took %s", elapsed)

    if err != nil {
    return nil, err
    }

    return &message, nil
}

Voici le résultat du suivi du temps de fonction :

Querying messages took 2.320409472s

Cela n'a rien à voir avec la connexion Internet car j'ai testé la requête avec python et la requête n'a pris que 0,003 seconde

J'ai essayé de changer la version du package mais cela n'a pas fonctionné. J'ai également essayé de réinstaller tous les packages du projet avec le même résultat.

J'ai également essayé de créer un index de recherche dans la base de données, mais je n'ai pas obtenu de résultats différents. La requête prend également plus de 2 secondes.

Je pense que la requête ne devrait pas prendre plus de quelques millisecondes.


Bonne réponse


mongo.Connect() "only" 通过启动后台监控 goroutine 来初始化 Client. Il n'est peut-être pas nécessaire de se connecter à une base de données (à distance).

Lorsque vous exécutez des requêtes, elles doivent bien entendu établir une connexion, ce qui peut prendre quelques secondes.

Vous pouvez utiliser la méthode Client.Ping() pour forcer une connexion à la base de données auparavant et vérifier que la connexion a été créée avec succès, ainsi lorsque vous exécutez la requête, la connexion sera prête.

Vous pouvez également essayer de répéter la même requête car après la première requête, la connexion n'est pas fermée mais placée dans le pool de connexions et réutilisée (pour la deuxième requête) lorsque cela est à nouveau nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer