2012-04-18 10 views
6

Sto tentando di utilizzare MongoJS come wrapper per il driver Mongo nativo nel nodo. Sto modellando i documenti nella mia raccolta come classi JavaScript con metodi come populate(), save(), ecc.Qual è il modo corretto per gestire le connessioni a Mongo con MongoJS?

Nella maggior parte delle lingue come C# e Java, sono solito connettersi e disconnettere esplicitamente per ogni query. La maggior parte degli esempi fornisce solo un esempio di connessione, ma non chiude mai la connessione quando viene eseguita. Sono incerto se il guidatore è in grado di gestirlo da solo o se devo farlo manualmente da solo. La documentazione è scarsa.

Ecco il codice rilevante:

User.prototype.populate = function(callback) { 
    var that = this;  

    this.db = mongo.connect("DuxDB"); 
    this.db.collection(dbName).findOne({email : that.email}, function(err, doc){ 
     if(!err && doc) { 
      that.firstName = doc.firstName; 
      that.lastName = doc.lastName; 
      that.password = doc.password; 
     } 

     if (typeof(callback) === "function"){ 
      callback.call(that); 
     } 

     that.db.close(); 
    }); 
}; 

Ho constatato che, non appena chiamo il metodo close() sull'oggetto MongoJS, non posso più aprire una nuova connessione per le chiamate successive. Tuttavia, se non chiamo questo metodo, il processo Node non termina mai una volta terminate tutte le chiamate asincrone, come se fosse in attesa di disconnettersi da Mongo.

Qual è il modo corretto per gestire le connessioni a Mongo con MongoJS?

risposta

7

Otterrete prestazioni migliori dall'applicazione se si lascia la connessione aperta, piuttosto che la disconnessione. Stabilire una connessione TCP e, nel caso di MongoDB, scoprire la configurazione di serie/sharding di replica laddove appropriato, è relativamente costoso rispetto al tempo impiegato per l'elaborazione di query e aggiornamenti. È meglio "spendere" questa volta una volta e mantenere la connessione aperta anziché ripetere costantemente questo lavoro.

+2

Ha senso. C'è un momento appropriato per chiudere la connessione quando non ho più bisogno dell'oggetto (una sorta di distruttore)? O è questo preso in considerazione dal driver quando la garbage JavaScript raccoglie il riferimento all'oggetto MongoJS? Non chiamare close() non consente mai al processo del nodo di terminare nella console quando tutte le chiamate sono terminate. – DuxPrime

5

Non aprire + chiudi una connessione per ogni query. Apri la connessione una volta e riutilizzala.

2

fare qualcosa di più come questo riutilizzare la tua connessione db per tutte le chiamate

User = function(db) { 
    this.db = db; 
} 


User.prototype.populate = function(callback) { 
    var that = this; 
    this.db.collection(dbName).findOne({email : that.email}, function(err, doc){ 
     if(!err && doc) { 
      that.firstName = doc.firstName; 
      that.lastName = doc.lastName; 
      that.password = doc.password; 
     } 

     if (typeof(callback) === "function"){ 
      callback.call(that); 
     } 
    }); 
}; 
0

credo che in realtà chiude la connessione dopo ogni richiesta, ma imposta {auto_reconnect: true} nella configurazione del server MongoDB, quindi riaprirà una nuova connessione ogni volta che ne è necessario uno.

Problemi correlati