Next.js中MongoDB连接数超限,是否需手动关闭?求解决方案
解决MongoDB连接数超限问题:复用数据库连接
核心问题分析
你的代码每次调用recordSearch都会重新执行connectToDatabase创建新的MongoDB连接,未复用已有连接。MongoDB驱动自带连接池管理,但频繁新建连接会让连接池机制失效,导致连接数快速累积直至超限。无需手动调用db.close(),但关键是要复用连接。
解决方案:缓存数据库连接
将数据库连接逻辑抽离并缓存连接实例,确保同一进程内的请求复用同一个连接:
- 创建独立的数据库连接文件(例如
lib/mongodb.js):
import { MongoClient } from 'mongodb'; // 缓存已创建的数据库实例 let cachedDb = null; export async function connectToDatabase() { // 已有缓存连接则直接返回 if (cachedDb) { return cachedDb; } // 新建连接并缓存 const client = await MongoClient.connect(process.env.MONGODB_URI); const db = client.db(process.env.MONGODB_DB); cachedDb = db; return db; }
- 修改
recordSearch函数:
async function recordSearch(character) { "use server"; const db = await connectToDatabase(); // 复用缓存的连接 const characterSearchCollection = db.collection("CharacterSearch"); await characterSearchCollection.insertOne({ search_character: character, searched_at: new Date(), }); }
额外优化建议
- 调整连接池配置:若后续仍有连接压力,可在创建客户端时指定连接池大小:
const client = await MongoClient.connect(process.env.MONGODB_URI, { maxPoolSize: 10, // 根据服务器资源和请求量调整 });
- 监控连接状态:通过MongoDB监控工具查看连接数变化,验证复用效果。
内容的提问来源于stack exchange,提问作者mmd
相关产品推荐
相关产品推荐

