我需要AWS Lambda中有效的MySQL数据库连接(使用节点J)。
不是为每个请求创建连接/池,而是重用它。
我得到的一个解决方案是打开AWS lambda处理程序外部的连接。但这种情况下的问题是,如果我们不结束连接,我们最终会得到超时结果。例如
"use strict";
var db = require('./db');
exports.handler = (event, context, callback) => {
db.connect(function (conn) {
if (conn == null) {
console.log("Database connection failed: ");
callback("Error", "Database connection failed");
} else {
console.log('Connected to database.');
conn.query("INSERT INTO employee(name,salary) VALUE(?,?)",['Joe',8000], function(err,res){
if(err) throw err;
else {
console.log('A new employee has been added.');
}
});
db.getConnection().end();
callback(null, "Database connection done");
}
});
};
在AWS Lambda中处理数据库连接的最可靠的方法是在调用本身中连接和断开数据库,这是您的代码已经在做的。
有一些已知的方法可以重用现有连接,但其成功率因数据库服务器配置(空闲连接等)和生产负载而异。
此外,在AWS Lambda的上下文中,由于Lambda中的扩展工作方式,重用数据库连接不会为您带来那么多的性能优势。
例如,在一个永远在线的服务器应用程序中,并发请求和后续请求使用并共享同一个连接或连接池。
然而,在Lambda中,并发请求由不同的服务器处理,每个服务器都有自己的数据库连接。10个并发请求将使10个独立的服务器连接到您的数据库。重用连接或连接池在这里没有任何帮助。
要解决您的问题,请使用:
context.callbackWaitsForEmptyEventLoop = false;
发生超时的原因是,由于处理程序外部的代码,事件循环不为空。此更改允许回调以立即结束 lambda 的执行。您的完整代码如下所示:
var db = require('./db');
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
db.connect(function (conn) {
// .. rest of your code that calls the callback
});
}
欲了解更多信息,请查看杰里米·戴利的博客文章。
https://www.jeremydaly.com/reuse-database-connections-aws-lambda/