sql >> Database teknologi >  >> NoSQL >> MongoDB

mgo - forespørgselsydeevne virker konsekvent langsom (500-650ms)

.. er der noget indlysende, der tyder på, hvorfor mine queriers i gennemsnit har 500-650ms?

Ja der er. Du ringer til mgo.Dial() før du udfører hver forespørgsel. mgo.Dial() skal oprette forbindelse til MongoDB-serveren hver gang, som du lukker lige efter forespørgslen. Forbindelsen kan højst sandsynligt tage hundredvis af millisekunder at etablere, inklusive godkendelse, allokering af ressourcer (både på server- og klientsiden) osv. Dette er meget spild.

Denne metode kaldes generelt kun én gang for en given klynge. Yderligere sessioner til den samme klynge etableres derefter ved hjælp af New eller Copy metoderne på den opnåede session. Dette vil få dem til at dele den underliggende klynge og administrere puljen af ​​forbindelser korrekt.

Opret en global sessionsvariabel, tilslut ved opstart én gang (ved at bruge f.eks. en pakke init() funktion), og brug den session (eller en kopi / klon af den, opnået af Session.Copy() eller Session.Clone() ).For eksempel:

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



  1. Opdatering af indlejret dokumentejendom i Mongodb

  2. Sådan opretter du en konfigurationsfil til MongoDB

  3. Hvordan fjerner jeg nøgler?

  4. Mongoose-opdatering uden tilbagekald