Il server NodeJS con mysql si blocca

Sto scrivendo un’applicazione usando NodeJS, Express, mysql, finora tutto funziona bene, ma quando eseguo la mia applicazione dopo un po ‘di tempo in cui la connessione mysql viene interrotta, la mia applicazione supera questa eccezione e la mia applicazione si interrompe.

Error: read ECONNRESET at errnoException (net.js:901:11) at TCP.onread (net.js:556:19) 

Da un altro punto di vista, sono venuto a sapere che devo gestire tali eccezioni non catturate come questa.

 process.on('uncaughtException', function(err) { console.log('Caught exception: ' + err); console.log(err.stack); }); 

dopo questo ora la mia applicazione non esce, ma invece riaggancia, quindi la mia domanda è come faccio a gestire questa eccezione in modo che la connessione mysql sia ok anche dopo questa eccezione e la mia applicazione non riaggancia.

Non sono sicuro che tu stia utilizzando il modulo node-mysql per il tuo progetto, ma lo ero, e ho riscontrato lo stesso problema ECONNRESET. Ecco una ripetizione della mia risposta sul mio problema :

Ho contattato la gente del nodo-mysql sulla loro pagina Github e ho ottenuto alcune risposte decise.

  1. MySQL infatti elimina le connessioni inattive. C’è una variabile MySQL “wait_timeout” che imposta il numero di secondi prima del timeout e il valore predefinito è 8 ore. Possiamo impostare il valore predefinito per essere molto più grande di quello. Utilizza le show variables like 'wait_timeout'; per visualizzare le impostazioni di timeout e set wait_timeout=28800; per cambiarlo.

  2. In base a questo problema , node-mysql non elimina le connessioni di pool dopo questi tipi di disconnessioni. Gli sviluppatori del modulo consigliavano di utilizzare un heartbeat per mantenere viva la connessione, come ad esempio chiamando SELECT 1; in un intervallo. Hanno inoltre raccomandato di utilizzare il modulo node-pool e l’opzione idleTimeoutMillis per eliminare automaticamente le connessioni inattive.

Ho trovato la soluzione e sto postando se qualcun altro sta affrontando lo stesso problema questo potrebbe aiutare anche voi ragazzi.

Innanzitutto ho rilevato tutte le eccezioni non rilevate, che hanno impedito alla mia applicazione di uscire in modo anomalo.

In secondo luogo, il problema di sospensione era dovuto al fatto che quando il server chiudeva la connessione, tutte le mie richieste venivano a mancare e il mio server avrebbe semplicemente riagganciato immagino il suo bug node-mysql, ma l’ho risolto usando il pool di connessione, nel pool se il server si chiudeva la connessione è stata riaperta dopo un secondo circa, quindi il mio problema è stato risolto in questo modo.

Ecco come sfruttare al massimo il pool-mysql pooling

L’errore si verifica quando più query vengono eseguite allo stesso tempo è necessario chiudere manualmente la connessione dopo l’esecuzione di una query. Ho creato un piccolo script che gestisce questo problema. https://gist.github.com/mkhizeryounas/647aebf07f37aabd5cddce66c45dcb25

 var mysql = require("mysql"); var keys = require('./keys'); var pool = mysql.createPool({ host : keys.mysql.host, port : keys.mysql.port, user : keys.mysql.user, password : keys.mysql.password, database : keys.mysql.database, }); module.exports = { getConnection (callback) { pool.getConnection((err, conn) => { if(err) { return callback(err); } callback(err, conn); }); }, query (query, params=[], cb) { this.getConnection((err, conn) => { conn.release(); if(err) return cb(err, null); conn.query(query, params, (err, res) => { if(err) return cb(err, null); return cb(null, res); }); }); } }