Соединение пула mysql с узлом с тем же самым соединением, полученным и освобожденным, увеличиваясь при каждом вызове

У меня есть приложение узла, подключенное к MySQL с помощью mysqljs / 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 может правильно установить соединение, но через несколько минут соединение будет потеряно и БД вернется: ECONTIMEOUT

Может кто-нибудь объяснить это поведение?

1 ответ

В журнале все идентификаторы потоков соединения одинаковы. Итак, пул больше не создавал новое соединение. В моем тесте, если я уберу следующий код из функции "запрос", то 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 ошибка. Обычно это проблема сети или брандмауэра. Вы могли бы попытаться сделать захват пакета, чтобы видеть, есть ли блокировка брандмауэра где-нибудь. Если это не так, вам следует сообщить о проблеме здесь для получения дополнительной помощи.

Другие вопросы по тегам