Estoy usando el controlador node-mongodb-native con MongoDB para escribir un sitio web.
Tengo algunas preguntas sobre cómo administrar las conexiones:
¿Es suficiente usar solo una conexión MongoDB para todas las solicitudes? ¿Hay algún problema de rendimiento? Si no, ¿puedo configurar una conexión global para usar en toda la aplicación?
Si no, ¿es bueno si abro una nueva conexión cuando llega la solicitud y la cierro cuando la recibo? ¿Es costoso abrir y cerrar una conexión?
¿Debo usar un grupo de conexión global? Escuché que el controlador tiene un grupo de conexiones nativo. ¿Es una buena elección?
Si uso un grupo de conexiones, ¿cuántas conexiones se deben usar?
¿Hay otras cosas que debería notar?
node.js
mongodb
database-connection
connection-pooling
Viento libre
fuente
fuente
Respuestas:
El confirmador principal de node-mongodb-native dice :
Entonces, para responder a su pregunta directamente, reutilice el objeto db que resulta de
MongoClient.connect()
. Esto le permite agrupar y proporcionará un aumento notable de la velocidad en comparación con las conexiones de apertura / cierre en cada acción db.fuente
req.db
este middleware: github.com/floatdrop/express-mongo-dbAbra una nueva conexión cuando se inicie la aplicación Node.js y reutilice el
db
objeto de conexión existente :/server.js
/api/users.js
Fuente: Cómo abrir conexiones de base de datos en una aplicación Node.js / Express
fuente
Aquí hay un código que administrará sus conexiones MongoDB.
Cuando inicie el servidor, llame
initPool
Luego, en cualquier otro módulo, puede hacer lo siguiente:
Esto se basa en la documentación de MongoDB . Mira esto.
fuente
Administre grupos de conexión mongo en un solo módulo autónomo. Este enfoque proporciona dos beneficios. En primer lugar, mantiene su código modular y más fácil de probar. En segundo lugar, no está obligado a mezclar su conexión de base de datos en su objeto de solicitud, que NO es el lugar para un objeto de conexión de base de datos. (Dada la naturaleza de JavaScript, consideraría altamente peligroso mezclar cualquier cosa en un objeto construido por código de biblioteca). Entonces con eso solo necesita considerar un módulo que exporta dos métodos.
connect = () => Promise
yget = () => dbConnectionObject
.Con dicho módulo, primero puede conectarse a la base de datos
Cuando está en vuelo, su aplicación simplemente puede llamar
get()
cuando necesita una conexión DB.Si configura su módulo db de la misma manera que lo siguiente, no solo tendrá una manera de asegurarse de que su aplicación no se iniciará a menos que tenga una conexión de base de datos, sino que también tendrá una forma global de acceder a su grupo de conexiones de base de datos que generará un error si no tienes una conexión
fuente
get()
obtenemos un grupo de conexiones, no una sola conexión. Un grupo de conexiones, como su nombre lo indica, es una colección lógica de conexiones de bases de datos. Si no hay conexiones en el grupo, el controlador intentará abrir una. Una vez que esa conexión está abierta, se usa y se devuelve al grupo. La próxima vez que se acceda al grupo, esta conexión puede reutilizarse. Lo bueno aquí es que el grupo administrará nuestras conexiones por nosotros, por lo que si se corta una conexión, es posible que nunca lo sepamos, ya que el grupo abrirá una nueva para nosotros.Si tiene Express.js, puede usar express-mongo-db para almacenar en caché y compartir la conexión MongoDB entre solicitudes sin un grupo (ya que la respuesta aceptada dice que es la forma correcta de compartir la conexión).
Si no, puede ver su código fuente y usarlo en otro marco.
fuente
He estado usando el grupo genérico con conexiones redis en mi aplicación, lo recomiendo encarecidamente. Es genérico y definitivamente sé que funciona con mysql, así que no creo que tengas ningún problema con él y con mongo
https://github.com/coopernurse/node-pool
fuente
Debe crear una conexión como servicio y luego reutilizarla cuando sea necesario.
mi muestra de App.js
y úsalo donde quieras con
fuente
http://mongoosejs.com/docs/api.html
Echa un vistazo a la fuente de Mangosta. Abren una conexión y la vinculan a un objeto Modelo, de modo que cuando se requiere el Objeto modelo, se realiza una conexión a la base de datos. El conductor se encarga de la agrupación de conexiones.
fuente
mongodb
.He implementado el siguiente código en mi proyecto para implementar la agrupación de conexiones en mi código para que cree una conexión mínima en mi proyecto y reutilice la conexión disponible
fuente
El mejor enfoque para implementar la agrupación de conexiones es crear una variable de matriz global que contenga el nombre db con el objeto de conexión devuelto por MongoClient y luego reutilizar esa conexión cada vez que necesite ponerse en contacto con la base de datos.
En su Server.js defina var global.dbconnections = [];
Cree una conexión de nomenclatura de servicios. Tendrá 2 métodos getConnection y createConnection. Entonces, cuando el usuario llame a getConnection (), encontrará detalles en la variable de conexión global y devolverá los detalles de la conexión si ya existe; llamará a createConnection () y devolverá los Detalles de la conexión.
Llame a este servicio usando db_name y devolverá el objeto de conexión si ya lo tiene, creará una nueva conexión y se la devolverá.
Espero eso ayude :)
Aquí está el código connectionService.js:
fuente
mongodb.com -> nuevo proyecto -> nuevo clúster -> nueva colección -> conectar -> dirección IP: 0.0.0.0/0 y db cred -> conecte su aplicación -> copie la cadena de conexión y pegue el archivo .env de su nodo aplicación y asegúrese de reemplazar "" con la contraseña real para el usuario y también reemplazar "/ prueba" con su nombre de base de datos
crear nuevo archivo .env
fuente
Si usa express, existe otro método más directo, que es utilizar la función integrada de Express para compartir datos entre rutas y módulos dentro de su aplicación. Hay un objeto llamado app.locals. Podemos adjuntarle propiedades y acceder desde nuestras rutas. Para usarlo, crea una instancia de tu conexión mongo en tu archivo app.js.
Ahora puede acceder a esta conexión de base de datos, o incluso a cualquier otro dato que desee compartir alrededor de los módulos de su aplicación, dentro de sus rutas,
req.app.locals
como se muestra a continuación, sin la necesidad de crear y requerir módulos adicionales.Este método garantiza que tenga una conexión de base de datos abierta durante la duración de su aplicación, a menos que elija cerrarla en cualquier momento. Es de fácil acceso
req.app.locals.your-collection
y no requiere la creación de ningún módulo adicional.fuente