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