MongoDB连接池默认启用,应全局单例初始化;避免每次请求新建MongoClient;合理设置maxPoolSize与minPoolSize;必须捕获connect错误并验证连接;Mongoose需禁用bufferCommands以防假死。

连接池不是“要打开”的功能,而是MongoDB官方驱动默认启用的机制——只要你不每次新建MongoClient实例、也不在每次操作后调用client.close(),池就在工作。
别在请求里new MongoClient
这是最常见也最致命的错误:把MongoClient初始化写在路由或服务函数内部。
- 每次HTTP请求都触发
new MongoClient(uri)→ 连接数线性爆炸,很快耗尽系统文件描述符 - 每个实例自带独立连接池(默认
maxPoolSize: 100),三节点副本集下最多开306个套接字,远超数据库承受能力 -
await client.connect()+await client.close()组合让连接无法复用,彻底废掉池的意义
正确做法只有一条:应用启动时全局单例初始化一次,在模块顶层导出复用。
maxPoolSize设多少才合理?
maxPoolSize不是越大越好,它必须匹配你的实际并发压力和MongoDB服务器资源上限。
- 默认100对多数中小API足够;高吞吐微服务可设为50–200,但需同步检查MongoDB的
maxIncomingConnections限制(尤其Atlas免费层默认仅50) - 设
minPoolSize等于maxPoolSize能保持“热连接”,避免突发流量时建连延迟,但会持续占用空闲连接 - 若应用有明显波峰波谷(如定时任务集中执行),建议
minPoolSize设为5–10,maxPoolSize按峰值预估,再配合maxIdleTimeMS: 30000自动回收空闲连接
注意:maxPoolSize不包含监控连接——副本集每台机器额外+2个心跳连接,这部分不计入你的业务连接配额。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
连接失败时别让它静默消失
Node.js进程不会因为MongoDB连不上就崩溃,但client.connect()失败后若没处理,后续所有DB操作都会挂起或抛错,接口超时却无日志。
- 必须用
try/catch包裹await client.connect(),并在catch里记录错误并退出进程(process.exit(1)),避免服务半残运行 - 监听
client.on('error', ...)捕获运行时断连,但注意:这不是重连开关,只是通知;真正可靠的重连靠驱动内置逻辑(前提是没调close()) - 加一个
await client.db().command({ ping: 1 })验证连接有效性,比单纯connect()更保险
别依赖autoReconnect: true(旧选项已废弃),现代驱动默认重试,但前提是连接实例没被销毁。
用mongoose时bufferCommands = false是刚需
如果你用mongoose而非原生驱动,bufferCommands: false和bufferMaxEntries: 0必须同时设,否则DB断连时操作会卡在缓冲队列里等重连,导致接口假死。
- 不设这两项 → 断连后
User.find()不报错、不返回,一直pending,直到超时或重连成功 - 设了之后 → 断连时立刻抛
MongooseServerSelectionError,你能捕获并返回503,前端感知明确 - 开发期可加
mongoose.set('debug', true)看每条查询,但生产环境务必关掉,避免I/O拖慢响应
真正容易被忽略的是:即使开了这些,如果代码里不小心在某个地方调用了client.close()(比如在测试清理逻辑里没隔离),整个连接池就不可逆地失效了——没有“ reopen ”方法,只能重启进程。

















