aws lambda中的连接池与rds?

kx1ctssn  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(555)

我需要在aws lambda中有效的mysql数据库连接(使用node js)。
它不是为每个请求创建连接/池,而是重用它。
我得到的一个解决方案是在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");
        }
    });
};
bweufnob

bweufnob1#

要解决您的问题,请使用:

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/

djmepvbi

djmepvbi2#

在aws lambda中处理数据库连接最可靠的方法是在调用本身中连接和断开与数据库的连接,这是您的代码已经在做的事情。
已知有重用现有连接的方法,但成功率因数据库服务器配置(空闲连接等)和生产负载而异。
另外,在aws lambda的上下文中,由于lambda中的伸缩方式,重用数据库连接并没有给您带来太多的性能好处。
例如,在总是在服务器上的应用程序中,并发请求和后续请求使用并共享同一个连接或连接池。
但是,在lambda中,并发请求由不同的服务器处理,每个服务器都有自己的数据库连接。10个并发请求将使10个单独的服务器连接到您的数据库。重用连接或连接池在这里没有任何帮助。

相关问题