2011-05-25 14 views
5

Estoy utilizando los controladores node-mongodb-native y estoy buscando una manera de abrir una conexión de base de datos persistente en lugar de abrir/cerrar cada vez .¿Cuál es la mejor manera de abrir una conexión de base de datos persistente (mongo) en NodeJS

Una conexión simplificada podría tener este aspecto ...

var DB = new mongo.Db('vows', new mongo.Server("127.0.0.1", 27017, {})), 
    connection = DB.open(function(err, db) { 
     // Here we have access to db 
    }); 

¿Cómo puedo hacer que el objeto db accesible a cualquier módulo en mi solicitud? ¿En lugar de tener que abrir la conexión para cada módulo por separado?

¿Esto se puede hacer utilizando module.exports? O una variable global?

Respuesta

1

Editar: No use mangosta, Use algo como mongo-col o . Luego, abra un solo cliente en su aplicación. Tengo un archivo ./client.js que exporta un cliente mongo correctamente abierto y configurado.


Mongoose es una abstracción sólida en la parte superior de mongodb que le permitirá manejar mongodb más fácilmente. Vale la pena mirar.

Lo que realmente quieres hacer es reabrir tu cliente cada vez que haces algo con mongo.

No mantiene una conexión abierta a ninguna otra base de datos.

Simplemente coloque su DB en un módulo junto con algunas funciones auxiliares/de envoltura.

+0

¿No es demasiado caro reabrir el cliente todo el tiempo? –

+1

@BinWang Estoy equivocado sobre todo. No deberías usar mangosta, apesta. Y no deberías volver a abrir el cliente todo el tiempo. – Raynos

+0

Estoy usando [generic-pool] (https://github.com/coopernurse/node-pool) ahora. También abre muchos clientes (conéctese a mongodb con "poolSize = 1" muchas veces) a la vez, manténgalo abierto y administre el grupo en sí. ¿Esto afecta el punto de referencia? –

5

Mi solución:

getClient = function(cb) { 
    if(typeof client !== "undefined") { 
     return cb(null, client); 
    } else { 
     db.open(function(err, cli) { 
      client = cli; 
      getClient(cb); 
     }); 
    } 
} 

Ahora, en lugar de

db.open(function(err, client) { 
    ...stuff... 
}); 

Do:

getClient(function(err, client) { 
    ...stuff... 
}); 

Su primera llamada db abre una conexión, los otros usan esa conexión.

BTW: sugerencias sobre la comprobación de que el cliente todavía está vivo?

+0

La manera de ver que el cliente sigue vivo es 'setTimeout (...)' después de la llamada 'getClient', y en el shell mongo, use' db.runCommand ({serverStatus: 1}). Connections' para ver cuántos conexiones que hay. No creo que el cliente siga vivo. –

Cuestiones relacionadas