Estoy creando un servidor web que almacena los datos de un usuario en una base de datos MongoDB. El código detrás de las solicitudes web utiliza funciones asíncronas para insertar un documento en la base de datos, pero debido a que estas funciones son asíncronas, significa que para cada solicitud se realiza una nueva conexión con el servidor.
exports.create_user = function(username, password, callback) { mongo.connect(url, function(err, db) { db.collection('users').insertOne({username: username, password: password}, function(err, result) { callback(result) db.close() }) }) }Tengo la impresión de que hacerlo de esta manera no es la mejor práctica, pero no puedo pensar en una manera de hacerlo usando el modelo de módulo que estoy usando arriba. Cualquier sugerencia o consejo sería apreciado.
Me topé con esto en mi propia investigación si usar una nueva conexión para mongodb en cada consulta es la mejor práctica o usar la agrupación de conexiones. Resulta que mongodb sugiere la agrupación de conexiones para la mayoría de los casos de uso.
Citando de los documentos :
Un grupo de conexiones es una memoria caché de las conexiones de la base de datos mantenida por el controlador para que las conexiones se puedan reutilizar cuando se requieran nuevas conexiones a la base de datos. Para reducir la cantidad de grupos de conexiones creados por su aplicación, recomendamos llamar a MongoClient.connect una vez y reutilizar la variable de la base de datos devuelta por la devolución de llamada.
Por lo general, uso el siguiente formulario para establecer y reutilizar una conexión mientras realizo consultas:
// db.js import { MongoClient } from 'mongodb'; // this will hold our cached database connection, which will itself hold multiple connections in a pool to be used let connection, database; export { connect: (next) => { // already established? => return connection if (database) return next(undefined, database); // establish connection MongoClient.connect('http://localhost:27017/admin', (err, db) => { if (err) return next(err); // save connection connection = db; // connect to database database = db.db('myDatabase'); // call callback next(undefined, database); }); }, disconnect: (next) => { if (!connection) return next(); // close connection connection.close(); next(); } };Disparando consultas:
import db from './db'; db.connect((err, db) => { if (err) return next(err); db.collection('myUsers').insertOne({name: 'test'}, (err) => { if (err) throw err; db.disconnect((err) => { if (err) throw err; console.log('Everything finished, database connection closed'); }); }); });Nota: es posible determinar la cantidad máxima de conexiones agrupadas manualmente (afaik, ¿el valor predeterminado es 5?). Consulte los documentos sobre cómo configurar la cantidad de conexiones abiertas a través de la URL de mongodb.
Al hacer db.close() puede cerrar la conexión. Si no cierra su conexión, el bucle de eventos mantendrá la conexión abierta y su proceso no se cerrará. Si está construyendo un servidor web en el que su proceso no terminará, no es necesario que cierre la conexión. Para un nodo de referencia-mongodb-native