nodejs mysql Error: Conexión perdida El servidor cerró la conexión

cuando uso el nodo mysql, aparece un error entre las 12:00 y las 2:00 de que el servidor cierra la conexión TCP. Este es el mensaje completo:

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) 

Existe la solución . Sin embargo, después de intentarlo de esta manera, el problema también aparece. ahora no sé cómo hacerlo. ¿Alguien conoce este problema?

Esta es la forma en que escribí seguir la solución:

  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(); 

Intente utilizar este código para manejar la desconexión del servidor:

 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(); 

En su código me faltan las partes después de la connection = mysql.createConnection(db_config);

Una solución pragmática es obligar a MySQL a mantener viva la conexión:

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

Prefiero esta solución para el grupo de conexiones y la desconexión de manejo porque no requiere estructurar el código de una manera que sea consciente de la presencia de la conexión. Hacer una consulta cada 5 segundos garantiza que la conexión permanecerá activa y PROTOCOL_CONNECTION_LOST no ocurrirá.

Además, este método asegura que mantendrá viva la misma conexión , en lugar de volver a conectarse. Esto es importante. Considere lo que sucedería si su script dependiera de LAST_INSERT_ID() y la conexión mysql se hubiera restablecido sin que usted lo supiera.

Sin embargo, esto solo garantiza que el tiempo de espera de conexión ( wait_timeout y interactive_timeout ) no ocurra. Fallará, como se esperaba, en todos los demás escenarios. Por lo tanto, asegúrese de manejar otros errores.

Para simular una conexión caída, intenta

connection.destroy ();

Más información aquí: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections

Crear y destruir las conexiones en cada consulta puede ser complicado, tuve algunos dolores de cabeza con la migración de un servidor cuando decidí instalar MariaDB en lugar de MySQL. Por alguna razón, en el archivo etc / my.cnf, el parámetro wait_timeout tenía un valor predeterminado de 10 segundos (hace que no se pueda implementar la persistencia). Luego, la solución se configuró en 28800, eso es 8 horas. Bueno, espero ayudar a alguien con esta “güevonada” … discúlpenme por mi mal inglés.