与同一连接的节点的mysql池连接获取并释放增加每个调用

我有一个节点应用程序连接到MySQL使用mysqljs / mysql最近我已经意识到这一点通过debugging:(服务器日志)

info: Url: /loginWeb info: Method: POST info: Connection 1098089 acquired info: Connection 1098089 released POST /loginWeb 200 214.618 ms - 186 info: Url: /loginWeb info: Method: POST info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 released info: Connection 1098089 released POST /loginWeb 200 76.776 ms - 186 info: Url: /loginWeb info: Method: POST info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 released info: Connection 1098089 released info: Connection 1098089 released POST /loginWeb 200 122.202 ms - 186 info: Url: /loginWeb info: Method: POST info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 released info: Connection 1098089 released info: Connection 1098089 released info: Connection 1098089 released POST /loginWeb 200 249.179 ms - 186 info: Url: /loginWeb info: Method: POST info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 acquired info: Connection 1098089 released info: Connection 1098089 released info: Connection 1098089 released info: Connection 1098089 released info: Connection 1098089 released POST /loginWeb 200 101.805 ms - 186 

正如您在日志中所看到的,每次调用都会获取并释放相同的连接。 我不明白为什么。

我的代码是这样的:

 const mysql = require('mysql') const pool = mysql.createPool(config.mysql) exports.query = function (query, params, callback) { pool.getConnection(function (err, connection) { if (err) { log.error('getConnection -> mysql connection error: ', err) throw err } connection.query(query, params, function (err, rows) { connection.release() if (!err) { callback(null, rows) } }) connection.on('error', function (err) { connection.release() log.error('on error -> mysql connection error: ', err) throw err }) }) pool.on('release', function (connection) { log.info('Connection %d released', connection.threadId) }) pool.on('acquire', function (connection) { log.info('Connection %d acquired', connection.threadId) }) } 

注:NodeJS可以稳定连接,但几分钟后连接丢失,数据库返回:ECONTIMEOUT

有人可以解释这种行为吗?

在日志中,所有连接的threadId都是相同的。 所以,池不再创build新的连接。 在我的testing中,如果我将下面的代码从“ query ”函数中移出,那么releaseacquire事件就一次一个。

 pool.on('release', function (connection) { log.info('Connection %d released', connection.threadId) }) pool.on('acquire', function (connection) { log.info('Connection %d acquired', connection.threadId) }) 

你也提到你有一个ECONTIMEOUT错误。 通常,这是一个networking或防火墙问题。 您可以尝试执行数据包捕获以查看是否有防火墙阻止某处。 如果情况并非如此,那么您最好在这里报告问题以获得进一步的帮助。