使用池而不破坏连接会使系统挂起

时间:2017-07-20 09:44:09

标签: mysql node.js aws-lambda

如果我将此代码部署到Amazon Lambda ...

var settings = require('./settings');
var mysql = require('mysql');
var pool = mysql.createPool({
    host: settings.host,
    database: settings.database,
    user: settings.user,
    password: settings.password
});

module.exports.handler = function (request, context, callback) {
    pool.getConnection(function (error, connection) {
        if (error)
            return callback(error);
        connection.query('select 1', null, function (error, results) {
            callback(null, results);
        });
    });
};

...端点以超时错误结束:

{
    "errorMessage": "2017-07-20T10:04:26.629Z cc46e503-6d32-11e7-8fa9-9902efa96cc1 Task timed out after 6.00 seconds"
}

如果我添加 connection.destroy - 此代码成功完成:

...
    connection.query('select 1', null, function (error, results) {
        connection.destroy();
        callback(null, results);
    });
...

但我认为破坏联系不是一个好习惯。 如果我使用 connection.release()而不是 connection.destroy() - 这没有帮助,请像第一个示例一样挂起。

1 个答案:

答案 0 :(得分:1)

解决方案是将 context.callbackWaitsForEmptyEventLoop = false; 添加到我的处理程序中:

module.exports.handler = function (request, context, callback) {
   context.callbackWaitsForEmptyEventLoop = false;
   ....