Почему запрос mysql уходит в таймаут?
Салют. Не могу победить проблему в связке nodejs + mysql. Время от времени mysql запросы уходят в таймаут и как следствие не выполняются. Происходит это примерно раз в несколько минут.
Вот две наиболее частые ошибки:
(node:617890) UnhandledPromiseRejectionWarning: Error: Handshake inactivity timeout
(node:618075) UnhandledPromiseRejectionWarning: Error: read ETIMEDOUT
Вот модуль:
const mysql = require('mysql')
const mysqlConfig = {
host: 'externalHost',
user: 'demo',
password: 'demo',
database: 'demo'
}
const pool = mysql.createPool(mysqlConfig)
const db = {}
db.query = (sql, args = null) => {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
if (err) {
console.log('Error getConnection:')
return reject(err)
} else {
connection.query(sql, args, (err, res) => {
if (err) {
console.log('Error query:')
return reject(err)
} else {
connection.release()
return resolve(res)
}
})
}
})
})
}
module.exports = { db }
Использую:
const {db} = require('db.js')
const fn = async () => {
const query = await db.query(
'SELECT * FROM table WHERE id = ?',
[1]
)
console.log(query[0])
}
Пробовал ставить таймауты большие, но это лишь не много оттягивает проблему. В чем может быть дело?
Окружение:
- node v14.2.0
- npm v6.14.5
- mysql v2.18.1
Ответы (2 шт):
Попробуйте заменить mysql пакет на mysql2 который работает на Promise. Подключение и использование mysql практически не изменится:
const mysql = require('mysql2')
mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_NAME,
database: process.env.DB_DATABASE,
password: process.env.DB_PASSWORD
}).promise();
await mysql.query('SELECT * FROM table WHERE id = ?;', [1])
.then((data) => {
console.log(data[0])
}
Так же использование самых новых версий node.js не лучший вариант, в связи с возможными ошибками, используйте лучше рекомендуемую версию ( 12.17.0 )
Нашел решение, как избавиться от данной проблемы.
Начать нужно с того что вероятно проблема была не в ноде и не в пакетах мускла, а скорее всего в настройках самого мускла или в nginx который проксирует мускл сервер.
В моем конфиге был указан хост ( pma.host.com ) я его заменил на ип адрес своей локальной сети ( 192.168.1.5 ) и проблема перестала появляться (пока что)
Далее я не много изменил модуль взаимодействия с бд:
require('dotenv').config()
const mariadb = require('mariadb/callback')
const mysqlConfig = {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME
}
const driver = mariadb.createPool(mysqlConfig)
const db = {}
db.query = (sql, args = null) => {
return new Promise((resolve, reject) => {
driver.getConnection((err, connect) => {
if (err) return reject(err)
connect.query(sql, args, (err, rows) => {
if (err) {
connect.end()
return reject(err)
}
connect.end()
return resolve(rows)
})
})
})
}
module.exports = { db, mysqlConfig }
Перешел на пакет mariadb. С пакетами mysql, mysql2 и тп не тестил.