2013-11-26 14 views
43

Wenn ich Knoten mysql verwenden, wird ein Fehler zwischen 12:00 bis 2:00 angezeigt, dass die TCP-Verbindung vom Server heruntergefahren wird. Dies ist die vollständige Nachricht:nodejs mysql Fehler: Verbindung verloren Der Server hat die Verbindung geschlossen

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) 

Es ist die solution. Nachdem ich auf diese Weise versucht habe, erscheint das Problem auch. jetzt weiß ich nicht, wie es geht. Hat jemand dieses Problem? Hier

ist die Art, wie ich folgen schrieb die Lösung:

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

Antwort

93

Try this code verwenden Server trennen zu handhaben:

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

In Ihrem Code Ich vermisse die Teile nach connection = mysql.createConnection(db_config);

+0

ok, ich werde das versuchen. aber wie könnte ich diese siutation simulieren – jackieLin

+0

Warum müssen Sie das simulieren? – CloudyMarble

+0

Jetzt ist der Code funktioniert. Das Datenbankobjekt ist nicht null, und bei der Auswahl der Datenbank kann es nicht immer ausgeführt und gestoppt werden. Aber der Server zeigt keinen Fehler! – jackieLin

22

Eine pragmatische Lösung besteht darin, MySQL zu zwingen, die Verbindung aufrecht zu erhalten:

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

Ich bevorzuge diese Lösung für Verbindungspool und Handhabung trennen, da es nicht erforderlich ist, Ihren Code in einer Weise zu strukturieren, die Connection Präsenz bewusst ist. Durch die Abfrage alle 5 Sekunden wird sichergestellt, dass die Verbindung bestehen bleibt und PROTOCOL_CONNECTION_LOST nicht auftritt.

Darüber hinaus stellt diese Methode sicher, dass Sie die gleiche Verbindung lebendig halten, im Gegensatz zu wieder verbinden. Das ist wichtig. Überlegen Sie, was passieren würde, wenn Ihr Skript auf LAST_INSERT_ID() angewiesen wäre und die mysql-Verbindung zurückgesetzt wurde, ohne dass Sie sich dessen bewusst sind?

Dies stellt jedoch nur sicher, dass das Verbindungstimeout (wait_timeout und interactive_timeout) nicht auftritt. Es wird wie erwartet in allen anderen Szenarien fehlschlagen. Stellen Sie daher sicher, dass Sie mit anderen Fehlern umgehen.

+0

Nur neugierig, wo würdest du diese DB-Abfrage setzen? Am unteren Rand des Nodejs Server richtig? Das einzige Problem ist, ich benutze nur mysql, um einen Benutzer einmal zu authentifizieren, und dann speichern ich ihre Daten in einem temporären Benutzerobjekt für mein RPG-Spiel. Ich weiß nicht, warum ich diesen mysql closed Fehler zufällig heute bekommen habe, hmm. Ich schließe die Verbindung auch usw. gut. –

+1

Sie sollten eine Verbindung zur Datenbank herstellen und die Verbindung bei Bedarf trennen. Diese Lösung eignet sich für Dienste, die kontinuierlich ausgeführt werden und jederzeit eine Datenbankverbindung verwenden. – Gajus

+0

Wenn das der Fall ist, wäre es möglich, dass ich ein mögliches Speicherleck habe oder vergessen habe, eine db.end() anzuwenden? –

-1

Erstellen und die Verbindungen in jeder Abfrage vielleicht kompliziert zu zerstören, ich hatte einige Kopfschmerzen mit einer Server-Migration, wenn ich MariaDB stattdessen MySQL installieren entschieden. Aus irgendeinem Grund hatte der Parameter wait_timeout in der Datei etc/my.cnf einen Standardwert von 10 Sek. (Dies bewirkt, dass die Persistenz nicht implementiert werden kann). Dann wurde die Lösung in 28800 gesetzt, das sind 8 Stunden. Nun, ich hoffe jemand mit dieser "güevonada" zu helfen ... entschuldige mich für mein schlechtes Englisch.

Verwandte Themen