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