ошибка mysql nodejs: соединение потеряно сервер закрыл соединение

когда я использую узел mysql, между 12:00 и 2:00 появляется ошибка, что TCP-соединение выключено сервером. Это полное сообщение:

Error: Connection lost: The server closed the connection.
at Protocol.end (/opt/node-v0.10.20-linux-x64/IM/node_modules/mysql/lib/protocol/Protocol.js:73:13)
at Socket.onend (stream.js:79:10)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:920:16
at process._tickCallback (node.js:415:13)

есть решение. Однако после того, как я попробую таким образом, проблема также появится. теперь я не знаю, как это сделать. Кто-нибудь сталкивается с этой проблемой?

вот как я написал, следуйте решению:

    var handleKFDisconnect = function() {
    kfdb.on('error', function(err) {
        if (!err.fatal) {
            return;
        }
        if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
            console.log("PROTOCOL_CONNECTION_LOST");
            throw err;
        }
        log.error("The database is error:" + err.stack);

        kfdb = mysql.createConnection(kf_config);

        console.log("kfid");

        console.log(kfdb);
        handleKFDisconnect();
    });
   };
   handleKFDisconnect();

4 ответов


попробуйте использовать код для обработки отключения сервера:

var db_config = {
  host: 'localhost',
    user: 'root',
    password: '',
    database: 'example'
};

var connection;

function handleDisconnect() {
  connection = mysql.createConnection(db_config); // Recreate the connection, since
                                                  // the old one cannot be reused.

  connection.connect(function(err) {              // The server is either down
    if(err) {                                     // or restarting (takes a while sometimes).
      console.log('error when connecting to db:', err);
      setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
    }                                     // to avoid a hot loop, and to allow our node script to
  });                                     // process asynchronous requests in the meantime.
                                          // If you're also serving http, display a 503 error.
  connection.on('error', function(err) {
    console.log('db error', err);
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
      handleDisconnect();                         // lost due to either server restart, or a
    } else {                                      // connnection idle timeout (the wait_timeout
      throw err;                                  // server variable configures this)
    }
  });
}

handleDisconnect();

в вашем коде мне не хватает частей после connection = mysql.createConnection(db_config);


прагматическое решение состоит в том, чтобы заставить MySQL поддерживать соединение:

setInterval(function () {
    db.query('SELECT 1');
}, 5000);

Я предпочитаю это решение пулу соединений и обработке разъединения, потому что оно не требует структурирования кода таким образом, чтобы знать о наличии соединения. Выполнение запроса каждые 5 секунд гарантирует, что соединение останется живым и PROTOCOL_CONNECTION_LOST не происходит.

кроме того, этот метод гарантирует то, что вы держите ту же связь живой, as против повторного подключения. Это важно. Подумайте, что произойдет, если ваш скрипт полагается на LAST_INSERT_ID() и соединение mysql было сброшено без вашего ведома об этом?

однако, это только гарантирует, что время ожидания соединения (wait_timeout и interactive_timeout) не происходит. Как и ожидалось, он не сработает во всех остальных сценариях. Поэтому не забудьте обработать другие ошибки.


для имитации отброшенного соединения попробуйте

connection.destroy();

дополнительная информация здесь: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections


создание и уничтожение соединений в каждом запросе может быть сложным, у меня были некоторые головные боли с миграцией сервера, когда я решил установить MariaDB вместо MySQL. По какой-то причине в файле etc/my.cnf параметр wait_timeout имеет значение по умолчанию 10 сек (это приводит к тому, что персистентность не может быть реализована). Затем решение было установлено в 28800, то есть 8 часов. Ну, я надеюсь помочь кому-то с этим "güevonada"... извините за плохой английский.