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

когда я использую узел 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(); 

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

 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 не будет.

Кроме того, этот метод гарантирует, что вы сохраняете одно и то же соединение в живом состоянии , а не повторно подключаетесь. Это важно. Подумайте, что произойдет, если ваш сценарий, основанный на 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 часов. Ну, я надеюсь помочь кому-то с этой «гуэвонадой» … извините за мой плохой английский.

  • Есть ли способ получить версию из package.json в коде nodejs?
  • Использование npm за корпоративным прокси .pac
  • CORS: нельзя использовать подстановочный знак в Access-Control-Allow-Origin, когда флаг учетных данных верен
  • Примеры использования RedisStore в socket.io
  • После установки Gulp: «no command» gulp «found»
  • Node.js - SyntaxError: Неожиданный импорт токена
  • node.js эквивалент python, если __name__ == '__main__'
  • Как перенаправить в expressjs при передаче некоторого контекста?
  • MongoDB / Mongoose запрос в определенную дату?
  • Как выйти из Node.js
  • Подключение express.js с помощью Angular CLI в среде dev
  • Давайте будем гением компьютера.