2012-04-18 17 views
6

Estoy intentando usar MongoJS como un contenedor para el controlador nativo de Mongo en Nodo. Estoy modelando los documentos en mi colección como clases de JavaScript con métodos como populate(), save(), etc.¿Cuál es la forma correcta de administrar las conexiones a Mongo con MongoJS?

En la mayoría de los lenguajes como C# y Java, estoy acostumbrado a conectar y desconectar explícitamente para cada consulta. La mayoría de los ejemplos solo dan un ejemplo de conexión, pero nunca cierran la conexión cuando termina. No estoy seguro si el controlador puede administrar esto solo o si tengo que hacerlo yo mismo manualmente. La documentación es escasa.

Aquí está el código correspondiente:

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(); 
    }); 
}; 

estoy encontrando que tan pronto como lo llamo el método close() en el objeto MongoJS, ya no puedo abrir una nueva conexión en llamadas posteriores. Sin embargo, si no llamo a este método, el proceso de Nodo nunca termina una vez que finalizan todas las llamadas asíncronas, como si estuviera esperando desconectarse de Mongo.

¿Cuál es la forma correcta de administrar las conexiones a Mongo con MongoJS?

Respuesta

7

Obtendrá un mejor rendimiento de su aplicación si deja la (s) conexión (es) abierta (s), en lugar de desconectarla. La realización de una conexión TCP y, en el caso de MongoDB, el descubrimiento de la configuración del conjunto/sharding de la réplica, según corresponda, es relativamente costosa en comparación con el tiempo invertido en el procesamiento de consultas y actualizaciones. Es mejor "gastar" esta vez una vez y mantener la conexión abierta en lugar de repetir constantemente este trabajo.

+2

Tiene sentido. ¿Hay un momento apropiado para cerrar la conexión cuando ya no necesito el objeto (como un tipo de destructor)? ¿O el conductor tiene esto en cuenta cuando la basura de JavaScript recopila la referencia al objeto MongoJS? No llamar a close() nunca permite que el proceso de nodo finalice en la consola cuando finalizan todas las llamadas. – DuxPrime

5

No abra ni cierre una conexión para cada consulta. Abra la conexión una vez y vuelva a usarla.

2

Haz algo de la misma familia reutilización de su conexión db de todas las llamadas

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

yo creo que en realidad se cierra la conexión después de cada solicitud, pero establece {auto_reconnect: true} en la configuración del servidor MongoDB, por lo que volverá a abrir una nueva conexión cada vez que sea necesario.

Cuestiones relacionadas