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”函数,那么 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 错误。通常,这是网络或防火墙问题。您可以尝试进行数据包捕获以查看是否有防火墙阻止某处。如果不是这种情况,您最好报告问题 here 以获得进一步的帮助。