You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:55:23