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)
Ahí está la solución . Sin embargo, después de intentarlo de esta manera, el problema también aparece. ahora no se como hacer. ¿Alguien resuelve este problema?
Esta es la forma en que escribí, sigue 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();
mysql
node.js
dbconnection
JackieLin
fuente
fuente
No recuerdo mi caso de uso original para este mecanismo. Hoy en día, no puedo pensar en ningún caso de uso válido.
Su cliente debería poder detectar cuándo se pierde la conexión y permitirle volver a crearla. Si es importante que parte de la lógica del programa se ejecute utilizando la misma conexión, utilice transacciones.
tl; dr; No utilice este método.
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 al grupo de conexiones y al manejo de la desconexión porque no requiere estructurar su código de una manera que sea consciente de la presencia de conexión. Hacer una consulta cada 5 segundos asegura que la conexión permanecerá activa y
PROTOCOL_CONNECTION_LOST
no ocurrirá.Además, este método asegura que mantiene viva la misma conexión , en lugar de volver a conectarla. Esto es importante. Considere lo que sucedería si su script dependiera
LAST_INSERT_ID()
y la conexión mysql se restablecieran sin que usted se dé cuenta.Sin embargo, esto solo garantiza que no se produzca el tiempo de espera de conexión (
wait_timeout
yinteractive_timeout
). Fallará, como se esperaba, en todos los demás escenarios. Por lo tanto, asegúrese de manejar otros errores.fuente
Para simular una conexión interrumpida, intente
connection.destroy();
Más información aquí: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections
fuente
La mejor solución es usar la piscina; me encargaré de esto por usted.
const pool = mysql.createPool({ host: 'localhost', user: '--', database: '---', password: '----' }); // ... later pool.query('select 1 + 1', (err, rows) => { /* */ });
https://github.com/sidorares/node-mysql2/issues/836
fuente
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 la persistencia no se pueda implementar). Luego, la solución se configuró en 28800, eso es 8 horas. Bueno, espero ayudar a alguien con esta "güevonada" ... disculpe mi mal inglés.
fuente