使用池而不破坏连接会导致系统挂起
如果我将这个代码部署到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() – 这没有帮助,像第一个例子一样挂起。
解决的办法是添加context.callbackWaitsForEmptyEventLoop = false; 给我的处理程序:
module.exports.handler = function (request, context, callback) { context.callbackWaitsForEmptyEventLoop = false; ....