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

NestJs定时任务报错‘Connection pool for {host} was cleared’原因及解决

NestJS定时任务连接MongoDB时间歇性出现「Connection pool for {host} was cleared because another operation failed」错误

问题描述

在NestJS中配置了每小时执行的定时任务,用于删除12小时内未验证邮箱的用户。但控制台偶尔会出现Connection pool for {host} was cleared because another operation failed错误,该错误间歇性出现。使用的MongoDB免费云数据库仅包含1个users表,仅有2条数据,不存在数据库过载情况。

相关代码:

@Cron(CronExpression.EVERY_HOUR, {
  name: 'cleanUnverifiedUsers',
})
async cleanUnverifiedUsers() {
  try {
    const twelveHoursAgo = new Date(Date.now() - 12 * 60 * 60 * 1000);

    await this.userModel.deleteMany({
      is_verified_email: false,
      created_at: { $lte: twelveHoursAgo },
    });
  } catch (e) {
    // logic
  }
}

可能原因

  • MongoDB免费版连接限制:免费集群(如Atlas M0)有严格的连接数上限,即便数据量小,定时任务的周期性执行加上应用其他连接,偶尔会触发连接池的清理机制。
  • 连接池参数不匹配:默认的连接池配置(如poolSize、maxIdleTimeMS)可能和免费集群的资源限制不兼容,当连接空闲超时或出现短暂异常时,驱动会主动清理连接池。
  • 短暂网络波动:免费云数据库的网络稳定性弱于付费版,偶尔的网络抖动会导致单条数据库操作失败,触发连接池的错误清理逻辑。

解决办法

1. 调整MongoDB连接池配置

在NestJS的Mongoose模块配置中,设置适配免费集群的连接池参数:

MongooseModule.forRoot('mongodb+srv://your-connection-string', {
  poolSize: 5, // 免费版建议设为较小值,避免触发连接数限制
  minPoolSize: 1,
  maxIdleTimeMS: 30000, // 空闲连接30秒后回收
  serverSelectionTimeoutMS: 5000, // 缩短服务器选择超时时间
  socketTimeoutMS: 45000,
})

2. 增加错误重试逻辑

在定时任务中添加重试机制,避免单次网络波动或连接异常导致任务失败:

async cleanUnverifiedUsers() {
  const maxRetries = 3;
  let retries = 0;
  while (retries < maxRetries) {
    try {
      const twelveHoursAgo = new Date(Date.now() - 12 * 60 * 60 * 1000);
      await this.userModel.deleteMany({
        is_verified_email: false,
        created_at: { $lte: twelveHoursAgo },
      });
      break;
    } catch (e) {
      retries++;
      if (retries === maxRetries) {
        console.error('清理未验证用户失败,已达最大重试次数:', e);
      } else {
        await new Promise(resolve => setTimeout(resolve, 1000)); // 重试前等待1秒
      }
    }
  }
}

3. 确保连接单例复用

确认NestJS的MongooseModule使用默认单例配置,避免定时任务每次执行都新建独立连接(默认情况下MongooseModule是单例模式,无需额外配置)。

4. 调整定时任务执行时段

如果免费集群在特定时段有负载波动,可以将定时任务调整到低峰时段(比如凌晨)执行,降低连接冲突概率。

内容的提问来源于stack exchange,提问作者Mykola Sw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:38:31