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)
Это решение . Однако, после того, как я попытаюсь таким образом, проблема также возникает. теперь я не знаю, как это сделать. Кто-нибудь справляется с этой проблемой?
Вот как я написал следующее решение:
- NPM не устанавливает какие-либо модули: сетевой разъем зависает
- Каков предложенный способ установки brew, node.js, io.js, nvm, npm в OS X?
- nvm продолжает «забывать» узел в новом сеансе терминала
- Как разобрать HTML-страницу с помощью Node.js
- Попробуйте переустановить `node-sass` на узел 0.12?
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();
- NodeJS записывает файл изображения base64
- Какой ORM я должен использовать для Node.js и MySQL?
- Строка Node.js Mongoose.js для функции ObjectId
- Равномерность набора тестов chai не работает должным образом
- ExpressJS: как перенаправить запрос POST с параметрами
- Используйте модуль узла из casperjs
- Node.js - Mongoose - проверьте, существует ли коллекция
- Grunt в Windows 8: «grunt» не распознается
Попытайтесь использовать этот код для отключения сервера:
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 часов. Ну, я надеюсь помочь кому-то с этой «гуэвонадой» … извините за мой плохой английский.