如何在 lambda 函数中正确关闭数据库连接?
How to properly close the database connection in a lambda function?
在我的 lambda 函数中,我试图在发送回调后立即关闭 mongo 连接。但是它有一个问题。
- 当我发送请求时,该函数执行其职责,发送回调并关闭数据库连接。
- 发送第二个请求时,函数超时。
- 当我删除
db.close()
时一切正常。
我认为 lambda 为所有函数重新使用了连接,因为我在处理程序的顶部打开了连接:
// Connect to database
mongoose.connect(process.env.DATABASE_URL);
const handleCreateUser = async (event, context, callback) => {
// eslint-disable-next-line no-param-reassign
context.callbackWaitsForEmptyEventLoop = false;
const data = JSON.parse(event.body);
const { user, userProfile } = data;
await createUser({ callback, user, userProfile });
};
知道如何解决这个问题吗?我们真的必须在此时关闭连接吗?
可能会尝试 try-with-resource 自动关闭连接。
要么将 mongoose.connect
代码移到处理程序中,要么停止调用 db.close()
。您当前有一个数据库连接被 Lambda 函数的多次调用重用,但您在第一次调用完成后关闭它。
我的用法是 Python,但您将使用您喜欢的语言进行操作。 lambda 的最佳解决方案,考虑按次付费:
运行 在 lamba 函数之前全局执行此操作(我在配置中执行此操作 class)
if self.conn == None or self.conn.close == 1:
self.make_connection()
如何实施 make_connection() 取决于您。
根本不要使用 db.close()。
AWS 调用加载您的 lambda 函数并 运行 加载您的全局函数一次。
之后在每次调用时它只运行它保持加载一段时间的 lambda(从一些测试 20 分钟到 50 分钟)。
数据库驱动程序将在内部超时时关闭连接。
优点 - 长时间只打开一次连接,为每个 lambda 节省时间 运行。
缺点 - lambda 在内存中时你一直保持连接。
在我看来这是值得的。
在我的 lambda 函数中,我试图在发送回调后立即关闭 mongo 连接。但是它有一个问题。
- 当我发送请求时,该函数执行其职责,发送回调并关闭数据库连接。
- 发送第二个请求时,函数超时。
- 当我删除
db.close()
时一切正常。
我认为 lambda 为所有函数重新使用了连接,因为我在处理程序的顶部打开了连接:
// Connect to database
mongoose.connect(process.env.DATABASE_URL);
const handleCreateUser = async (event, context, callback) => {
// eslint-disable-next-line no-param-reassign
context.callbackWaitsForEmptyEventLoop = false;
const data = JSON.parse(event.body);
const { user, userProfile } = data;
await createUser({ callback, user, userProfile });
};
知道如何解决这个问题吗?我们真的必须在此时关闭连接吗?
可能会尝试 try-with-resource 自动关闭连接。
要么将 mongoose.connect
代码移到处理程序中,要么停止调用 db.close()
。您当前有一个数据库连接被 Lambda 函数的多次调用重用,但您在第一次调用完成后关闭它。
我的用法是 Python,但您将使用您喜欢的语言进行操作。 lambda 的最佳解决方案,考虑按次付费: 运行 在 lamba 函数之前全局执行此操作(我在配置中执行此操作 class)
if self.conn == None or self.conn.close == 1:
self.make_connection()
如何实施 make_connection() 取决于您。 根本不要使用 db.close()。
AWS 调用加载您的 lambda 函数并 运行 加载您的全局函数一次。 之后在每次调用时它只运行它保持加载一段时间的 lambda(从一些测试 20 分钟到 50 分钟)。 数据库驱动程序将在内部超时时关闭连接。
优点 - 长时间只打开一次连接,为每个 lambda 节省时间 运行。
缺点 - lambda 在内存中时你一直保持连接。
在我看来这是值得的。