.. Gibt es irgendetwas Offensichtliches, das darauf hindeutet, warum meine Queriers durchschnittlich 500-650 ms anzeigen?
Ja da ist. Sie rufen mgo.Dial()
auf bevor Sie jede Abfrage ausführen. mgo.Dial()
muss sich jedes Mal mit dem MongoDB-Server verbinden, den Sie direkt nach der Abfrage schließen. Die Herstellung der Verbindung kann sehr wahrscheinlich Hunderte von Millisekunden dauern, einschließlich Authentifizierung, Zuweisung von Ressourcen (sowohl auf Server- als auch auf Clientseite) usw. Dies ist sehr verschwenderisch.
Diese Methode wird im Allgemeinen nur einmal für einen bestimmten Cluster aufgerufen. Weitere Sitzungen mit demselben Cluster werden dann unter Verwendung der New- oder Copy-Methoden für die erhaltene Sitzung eingerichtet. Dadurch teilen sie sich den zugrunde liegenden Cluster und verwalten den Verbindungspool entsprechend.
Erstellen Sie eine globale Sitzungsvariable, verbinden Sie sich beim Start einmal (z. B. mit einem Paket init()
Funktion), und verwenden Sie diese Sitzung (oder eine Kopie / einen Klon davon, erhalten durch Session.Copy()
). oder Session.Clone()
).Zum Beispiel:
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...
}