问题描述
我将 MysqL2 包与 Express 框架一起使用,部署在 AWS Lamda 上。我已将 Aws Lambda 的预配置并发设置为 3。
我没有直接连接到 MysqL。我中间有 RDS 代理。
{
"errorType": "Error","errorMessage": "connect ETIMEDOUT","code": "ETIMEDOUT","errorno": "ETIMEDOUT","syscall": "connect","fatal": true,"stack": [
"Error: connect ETIMEDOUT"," at Connection._handleTimeoutError (/var/task/node_modules/MysqL2/lib/connection.js:178:17)"," at listOnTimeout (internal/timers.js:554:17)"," at processtimers (internal/timers.js:497:7)"
]
}
以下是我的代码:
var AWS = require("aws-sdk");
const MysqL = require('MysqL2');
class DBConnection {
constructor() {
var signer = new AWS.RDS.Signer({
region: 'us-east-1',hostname: process.env.DB_HOST,port: 3306,username: process.env.DB_USER
});
let connectionConfig = {
host: process.env.DB_HOST,user: process.env.DB_USER,database: process.env.DB_NAME,ssl: 'Amazon RDS',authPlugins: { MysqL_clear_password: () => () => signer.getAuthToken() }
};
this.db = MysqL.createConnection(connectionConfig);
}
query = async (sql,values) => {
return new Promise((resolve,reject) => {
this.db.execute(sql,values,(error,result) => {
if (error) {
reject(error);
return;
}
resolve(result);
});
});
}
}
module.exports = new DBConnection().query;
const results = await query('SELECT COUNT(*) AS total_listens FROM analytics WHERE event_name="PLAYED"');
问题可能出在哪里的任何线索?
解决方法
对于 AWS Lambda function
,最好使用 mysql.createPool
而不是 mysql.createconnection
。我不知道具体原因是什么,但使用 mysql.createconnection
而不是 mysql.createPool
也给我带来了问题。当查询成功时,还需要 release
连接。