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

Вот как максимально использовать пул узлов-mysql

Я не уверен, что вы используете модуль node-mysql для своего проекта, но я столкнулся с той же проблемой ECONNRESET. Вот повторение моего ответа на мой вопрос:

Я связался с ребятами из node-mysql на их странице в Github и получил твердые ответы.

  1. MySQL действительно удаляет простаивающие соединения. Есть переменная MySQL "wait_timeout", которая устанавливает количество секунд до истечения времени ожидания, и по умолчанию это 8 часов. Мы можем установить значение по умолчанию намного больше, чем это. использование show variables like 'wait_timeout'; чтобы просмотреть настройки тайм-аута и set wait_timeout=28800; изменить это.

  2. Согласно этой проблеме, 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);
        });
    });
  }
}
Другие вопросы по тегам