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

在AWS Lambda与Serverless架构下管理并缓存Mongoose连接的方法

解决AWS Lambda中Mongoose连接重复创建的问题

Lambda的执行环境存在复用特性(热启动),我们可以利用这一点结合Node.js的模块缓存,来避免每次调用都新建Mongoose连接。下面是适配你现有代码结构的修改方案:

1. 修改db.js,实现连接缓存

将原来直接调用mongoose.connect的逻辑,改为带缓存的异步连接函数,只在首次调用或连接断开时新建连接:

const mongoose = require('mongoose');

// 全局变量缓存已建立的数据库连接实例
let cachedDb = null;

async function connectToDatabase() {
  // 如果已有活跃连接,直接返回缓存实例
  if (cachedDb && mongoose.connection.readyState === 1) {
    return cachedDb;
  }

  try {
    // 建立新连接
    const db = await mongoose.connect(process.env.MONGODBURL, {
      useNewUrlParser: true,
      useUnifiedTopology: true, // 适配Mongoose 5.x+版本的必填配置
      maxPoolSize: 10, // 根据Lambda并发量调整连接池大小,避免超出MongoDB连接限制
    });

    // 缓存连接实例
    cachedDb = db;
    return db;
  } catch (err) {
    console.error('数据库连接失败:', err);
    throw err;
  }
}

module.exports = connectToDatabase;

2. 修改app.js,确保连接完成后初始化业务逻辑

原来的代码直接require('./db/db')无法等待连接完成,现在改为调用异步连接函数,确保数据库连接就绪后再挂载路由和中间件:

const express = require('express');
const connectToDatabase = require('./db/db');

const app = express();

// 初始化数据库连接后再加载业务逻辑
(async () => {
  await connectToDatabase();
  // 在这里挂载你的路由、中间件等业务代码
  // ...Rest code goes here
})();

module.exports = app;

关键原理说明

  • Lambda热启动时,执行环境会保留之前的全局变量和模块缓存,cachedDb会在多次调用之间复用,避免重复创建连接。
  • 检查mongoose.connection.readyState确保缓存的连接处于活跃状态,防止连接断开后复用无效连接。
  • 配置maxPoolSize是为了适配Lambda的并发调用特性,避免MongoDB因连接数过多拒绝新连接。

内容的提问来源于stack exchange,提问作者Siddhartha Panda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:57:10