mysql 与具有相同连接的节点的池连接获取和释放在每次调用时增加
mysql pool connection with node with the same connection acquired and released increasing on each call
我有一个节点应用程序使用 mysqljs/mysql 连接到 MySQL
最近我通过调试意识到了这一点:(服务器日志)
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 可以正确建立连接,但几分钟后连接就会丢失,DB returns: ECONTIMEOUT
有人可以解释这种行为吗?
在日志中,所有连接的threadId 都相同。因此,池不再创建新连接。在我的测试中,如果我将以下代码移出“query”函数,那么 release
和 acquire
事件会一次发出一次。
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
错误。通常,这是网络或防火墙问题。您可以尝试进行数据包捕获以查看是否有防火墙阻止某处。如果不是这种情况,您最好报告问题 here 以获得进一步的帮助。
我有一个节点应用程序使用 mysqljs/mysql 连接到 MySQL 最近我通过调试意识到了这一点:(服务器日志)
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 可以正确建立连接,但几分钟后连接就会丢失,DB returns: ECONTIMEOUT
有人可以解释这种行为吗?
在日志中,所有连接的threadId 都相同。因此,池不再创建新连接。在我的测试中,如果我将以下代码移出“query”函数,那么 release
和 acquire
事件会一次发出一次。
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
错误。通常,这是网络或防火墙问题。您可以尝试进行数据包捕获以查看是否有防火墙阻止某处。如果不是这种情况,您最好报告问题 here 以获得进一步的帮助。