MongoDB数据库连接应在何处关闭?附代码示例
MongoDB连接关闭的正确姿势
首先明确:MongoDB不推荐每次操作完就关闭连接,频繁创建/销毁连接会严重拖垮性能,正确做法是复用连接池,仅在整个应用停止时关闭连接池。
1. 全局初始化连接池,避免重复创建连接
把数据库连接的初始化放到项目启动入口(而非业务方法里重复调用),单独抽成模块复用:
// db.js - 数据库初始化模块 let dbInstance; // 项目启动时仅执行一次,建立连接池 async function initDatabase() { const myservice = await database(); dbInstance = myservice.getDatabase(); console.log('MongoDB连接池已建立'); } // 业务代码直接调用这个方法获取已有的数据库实例 function getDb() { if (!dbInstance) { throw new Error('请先初始化数据库连接'); } return dbInstance; } module.exports = { initDatabase, getDb };
修改你的Collector类,直接复用全局连接:
const { getDb } = require('./db'); class Collector { findCollection(id) { // 无需每次新建连接,直接用已初始化的实例 return getDb().collection('users'); } } module.exports = new Collector();
Base类可保持原有逻辑不变:
const Collector = require('./Collector'); class Base { async makeUser(id) { const userCollection = await Collector.findCollection(id); // 在这里执行查询、插入等业务操作 return userCollection; } } module.exports = new Base();
2. 仅在应用停止时关闭连接池
只有当整个服务要退出时,才需要关闭MongoDB连接池,比如监听Node.js进程的退出事件:
// 项目入口文件(如app.js) const { initDatabase } = require('./db'); // 启动应用时先初始化数据库 async function startApp() { await initDatabase(); // 启动你的Web服务(Express/Koa等)或其他业务逻辑 } startApp(); // 监听进程退出信号,关闭连接池 process.on('SIGINT', async () => { try { // 根据你使用的MongoDB驱动,调用对应的关闭方法 const client = await database(); await client.close(); console.log('MongoDB连接池已关闭'); process.exit(0); } catch (err) { console.error('关闭数据库连接失败:', err); process.exit(1); } });
为什么不能在业务方法里关闭?
- 每次关闭连接后,后续业务代码拿到的集合实例会直接失效,无法执行任何数据库操作;
- 连接池的核心价值就是复用连接,频繁创建/销毁会浪费大量系统资源,严重降低性能。
内容的提问来源于stack exchange,提问作者Ahmed Egeh
相关产品推荐
相关产品推荐

