我在AWS上部署了lambda函数。此lambda函数建立在NodeJS之上。此lambda函数包含多个脚本,每个脚本均由某个事件触发。最近,我在随机时间和执行随机脚本的过程中一直收到以下错误(我找不到模式)。
{
"errorType": "Error",
"errorMessage": "Connection lost: The server closed the connection.",
"code": "PROTOCOL_CONNECTION_LOST",
"fatal": true,
"stack": [
"Error: Connection lost: The server closed the connection.",
" at Protocol.end (/var/task/node_modules/mysql/lib/protocol/Protocol.js:112:13)",
" at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:97:28)",
" at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:525:10)",
" at Socket.emit (events.js:203:15)",
" at Socket.EventEmitter.emit (domain.js:448:20)",
" at endReadableNT (_stream_readable.js:1143:12)",
" at process._tickCallback (internal/process/next_tick.js:63:19)"
]
}
我做了一些研究,发现此错误是由MySql生成的。但是,该错误会在脚本执行期间发生,而脚本甚至不会以任何方式与MySQL交互。
我为MySQL创建了一个包装器,以实现其某些功能。下面是代码:
const util = require('util');
let lib = {
'mySqlWrapper': (config) => {
if (!config) {
config = {
host: process.env.MYSQL_HOST,
port: process.env.MYSQL_PORT,
user: process.env.MYSQL_USERNAME,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DB_NAME,
timezone: 'utc'
}
};
let connection = require("mysql").createConnection(config);
return {
query(sql, args) {
return util.promisify(connection.query).call(connection, sql, args);
},
close() {
return util.promisify(connection.end).call(connection);
},
beginTransaction() {
return util.promisify(connection.beginTransaction).call(connection);
},
commit() {
return util.promisify(connection.commit).call(connection);
},
rollback() {
return util.promisify(connection.rollback).call(connection);
}
};
}
}
module.exports = lib;
请注意,我确定每个连接都是在执行脚本时创建的,并且在脚本结束之前已关闭。
此外,我确实更改了数据库的一些超时,例如:
Name Value
connect_timeout 5
delayed_insert_timeout 5
lock_wait_timeout 10
wait_timeout 5
我不知道此错误的原因,尤其是它是随机发生的(并非始终如此),甚至在执行与MySQL无关的脚本时也是如此。有人可以帮我找到可能的原因吗?
答案 0 :(得分:1)
很难看到完整的功能。但是要明确一点,您是否在功能结束时关闭连接?您是否在处理程序功能之外建立连接?如果是这样,则它可以在同一台机器上的函数调用之间持续存在。您在mysql服务器上是否有可以检查的日志?