Wenn ich den Knoten MySQL verwende, wird zwischen 12:00 und 2:00 Uhr ein Fehler angezeigt, dass die TCP-Verbindung vom Server heruntergefahren wird. Dies ist die vollständige Nachricht:
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)
Da ist die Lösung . Nachdem ich es auf diese Weise versucht habe, tritt jedoch auch das Problem auf. jetzt weiß ich nicht wie ich es machen soll. Trifft jemand dieses Problem?
So habe ich geschrieben, folge der 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();
mysql
node.js
dbconnection
JackieLin
quelle
quelle
Ich erinnere mich nicht an meinen ursprünglichen Anwendungsfall für diesen Mechanismus. Heutzutage kann ich mir keinen gültigen Anwendungsfall vorstellen.
Ihr Client sollte erkennen können, wann die Verbindung unterbrochen wurde, und es Ihnen ermöglichen, die Verbindung neu zu erstellen. Wenn es wichtig ist, dass ein Teil der Programmlogik über dieselbe Verbindung ausgeführt wird, verwenden Sie Transaktionen.
tl; dr; Verwenden Sie diese Methode nicht.
Eine pragmatische Lösung besteht darin, MySQL zu zwingen, die Verbindung aufrechtzuerhalten:
Ich bevorzuge diese Lösung gegenüber dem Verbindungspool und der Behandlung von Verbindungsabbrüchen, da Ihr Code nicht so strukturiert werden muss, dass die Anwesenheit der Verbindung berücksichtigt wird. Wenn Sie alle 5 Sekunden eine Abfrage durchführen, wird sichergestellt, dass die Verbindung weiterhin besteht und
PROTOCOL_CONNECTION_LOST
nicht hergestellt wird.Darüber hinaus stellt diese Methode sicher, dass Sie dieselbe Verbindung aufrecht erhalten , anstatt erneut eine Verbindung herzustellen. Das ist wichtig. Überlegen Sie, was passieren würde, wenn Ihr Skript verwendet
LAST_INSERT_ID()
und die MySQL-Verbindung zurückgesetzt würde, ohne dass Sie sich dessen bewusst wären?Dies stellt jedoch nur sicher, dass kein Verbindungszeitlimit (
wait_timeout
undinteractive_timeout
) auftritt. In allen anderen Szenarien schlägt dies erwartungsgemäß fehl. Stellen Sie daher sicher, dass Sie andere Fehler behandeln.quelle
Versuchen Sie, eine unterbrochene Verbindung zu simulieren
Weitere Informationen finden Sie hier: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections
quelle
Eine bessere Lösung ist die Verwendung eines Pools.
https://github.com/sidorares/node-mysql2/issues/836
quelle
Das Erstellen und Zerstören der Verbindungen in jeder Abfrage ist möglicherweise kompliziert. Ich hatte einige Probleme mit einer Servermigration, als ich mich entschied, MariaDB anstelle von MySQL zu installieren. Aus irgendeinem Grund hatte der Parameter wait_timeout in der Datei etc / my.cnf einen Standardwert von 10 Sekunden (dies führt dazu, dass die Persistenz nicht implementiert werden kann). Dann wurde die Lösung auf 28800 eingestellt, das sind 8 Stunden. Nun, ich hoffe, ich helfe jemandem mit dieser "güevonada" ... entschuldige mich für mein schlechtes Englisch.
quelle