在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
相关产品推荐
相关产品推荐

