NodeJS Сервер с MySQL зависает
Я пишу приложение, используя NodeJS, Express, mysql, пока все работает нормально, но когда я запускаю свое приложение после некоторого времени, когда соединение mysql прерывается, мое приложение проходит через это исключение, и мое приложение отключается.
Error: read ECONNRESET
at errnoException (net.js:901:11)
at TCP.onread (net.js:556:19)
Из другого стекового вопроса я узнал, что должен обрабатывать такие неисчислимые исключения, как это.
process.on('uncaughtException', function(err) {
console.log('Caught exception: ' + err);
console.log(err.stack);
});
после этого теперь мое приложение не закрывается, а вместо этого зависает, поэтому мой вопрос заключается в том, как мне обработать это исключение, чтобы подключение mysql было в порядке даже после этого исключения, и мое приложение не зависало.
3 ответа
Я нашел решение и отправляю сообщение, если кто-то еще сталкивается с той же проблемой, это может помочь вам, ребята.
Сначала я перехватил все неперехваченные исключения, из-за которых мое приложение не вышло ненормально.
Вторая проблема с зависанием, с которой я столкнулся, заключалась в том, что, когда сервер закрывал соединение, все мои запрошенные запросы не выполнялись, и мой сервер просто зависал, я думаю, что это ошибка node-mysql, но я решил ее с помощью подключения пула, в пуле, если сервер закрыт. через секунду или около того соединение было восстановлено, поэтому моя проблема была решена таким образом.
Я не уверен, что вы используете модуль node-mysql для своего проекта, но я столкнулся с той же проблемой ECONNRESET. Вот повторение моего ответа на мой вопрос:
Я связался с ребятами из node-mysql на их странице в Github и получил твердые ответы.
MySQL действительно удаляет простаивающие соединения. Есть переменная MySQL "wait_timeout", которая устанавливает количество секунд до истечения времени ожидания, и по умолчанию это 8 часов. Мы можем установить значение по умолчанию намного больше, чем это. использование
show variables like 'wait_timeout';
чтобы просмотреть настройки тайм-аута иset wait_timeout=28800;
изменить это.Согласно этой проблеме, node-mysql не сокращает соединения пула после такого рода отключений. Разработчики модуля рекомендовали использовать сердцебиение, чтобы поддерживать соединение, такое как вызов
SELECT 1;
на интервале. Они также рекомендовали использовать модуль пула узлов и его опцию idleTimeoutMillis для автоматического сокращения незанятых соединений.
Ошибка возникает, когда несколько запросов выполняются одновременно, вам необходимо вручную закрыть соединение после выполнения запроса. Я сделал небольшой скрипт, который обрабатывает эту проблему. https://gist.github.com/mkhizeryounas/647aebf07f37aabd5cddce66c45dcb25
var mysql = require("mysql");
var keys = require('./keys');
var pool = mysql.createPool({
host : keys.mysql.host,
port : keys.mysql.port,
user : keys.mysql.user,
password : keys.mysql.password,
database : keys.mysql.database,
});
module.exports = {
getConnection (callback) {
pool.getConnection((err, conn) => {
if(err) {
return callback(err);
}
callback(err, conn);
});
},
query (query, params=[], cb) {
this.getConnection((err, conn) => {
conn.release();
if(err) return cb(err, null);
conn.query(query, params, (err, res) => {
if(err) return cb(err, null);
return cb(null, res);
});
});
}
}