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

Next.js中MongoDB连接数超限,是否需手动关闭?求解决方案

解决MongoDB连接数超限问题:复用数据库连接

核心问题分析

你的代码每次调用recordSearch都会重新执行connectToDatabase创建新的MongoDB连接,未复用已有连接。MongoDB驱动自带连接池管理,但频繁新建连接会让连接池机制失效,导致连接数快速累积直至超限。无需手动调用db.close(),但关键是要复用连接。

解决方案:缓存数据库连接

将数据库连接逻辑抽离并缓存连接实例,确保同一进程内的请求复用同一个连接:

  1. 创建独立的数据库连接文件(例如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;
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:47:06