nodejs mysql Errore: connessione persa Il server ha chiuso la connessione

quando utilizzo il nodo mysql, viene visualizzato un errore tra le 12:00 e le 2:00 che la connessione TCP viene arrestata dal server. Questo è il messaggio 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) 

C’è la soluzione . Tuttavia, dopo aver provato in questo modo, appare anche il problema. ora non so come fare. Qualcuno incontra questo problema?

Ecco come scrissi seguendo la soluzione:

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

Prova a utilizzare questo codice per gestire la disconnessione del server:

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

Nel tuo codice mi mancano le parti dopo la connection = mysql.createConnection(db_config);

Una soluzione pragmatica è forzare MySQL a mantenere in vita la connessione:

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

Preferisco questa soluzione al pool di connessioni e alla gestione della disconnessione perché non richiede di strutturare il codice in un modo che sia consapevole della presenza della connessione. Effettuare una query ogni 5 secondi assicura che la connessione rimanga triggers e PROTOCOL_CONNECTION_LOST non si verifichi.

Inoltre, questo metodo garantisce di mantenere viva la stessa connessione , invece di riconnettersi. Questo è importante. Considera cosa succederebbe se il tuo script fosse basato su LAST_INSERT_ID() e la connessione mysql fosse stata ripristinata senza che tu ne fossi a conoscenza?

Tuttavia, ciò garantisce che non si verifichi il timeout della connessione ( wait_timeout e interactive_timeout ). Fallirà, come previsto, in tutti gli altri scenari. Pertanto, assicurati di gestire altri errori.

Per simulare una connessione interrotta, prova

connection.destroy ();

Maggiori informazioni qui: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections

Creare e distruggere le connessioni in ogni query può essere complicato, ho avuto alcuni grattacapi con una migrazione del server quando ho deciso di installare MariaDB invece di MySQL. Per qualche ragione nel file etc / my.cnf il parametro wait_timeout aveva un valore predefinito di 10 sec (ciò causa che la persistenza non può essere implementata). Quindi, la soluzione è stata impostata su 28800, ovvero 8 ore. Beh, spero di aiutare qualcuno con questa “güevonada” … scusami per il mio pessimo inglese.