kiedy używam węzła mysql, pojawia się błąd między 12:00 a 2:00, że połączenie TCP jest zamykane przez serwer. Oto pełna wiadomość:
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)
Jest rozwiązanie . Jednak po tym, jak spróbuję w ten sposób, problem też się pojawia. teraz nie wiem, jak to zrobić. Czy ktoś napotyka ten problem?
Oto sposób, w jaki napisałem, postępuj zgodnie z rozwiązaniem:
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
źródło
źródło
Nie przypominam sobie mojego pierwotnego przypadku użycia tego mechanizmu. W dzisiejszych czasach nie mogę wymyślić żadnego ważnego przypadku użycia.
Twój klient powinien być w stanie wykryć utratę połączenia i umożliwić ponowne utworzenie połączenia. Jeśli ważne jest, aby część logiki programu była wykonywana przy użyciu tego samego połączenia, użyj transakcji.
tl; dr; Nie używaj tej metody.
Pragmatycznym rozwiązaniem jest wymuszenie na MySQL utrzymania połączenia:
setInterval(function () { db.query('SELECT 1'); }, 5000);
Wolę to rozwiązanie od puli połączeń i obsługi rozłączania, ponieważ nie wymaga ono strukturyzowania kodu w sposób świadomy obecności połączenia. Wykonywanie zapytania co 5 sekund gwarantuje, że połączenie pozostanie aktywne i
PROTOCOL_CONNECTION_LOST
nie nastąpi.Ponadto ta metoda zapewnia utrzymanie tego samego połączenia , w przeciwieństwie do ponownego łączenia. To jest ważne. Zastanów się, co by się stało, gdyby Twój skrypt opierał się na skrypcie
LAST_INSERT_ID()
i połączenie mysql zostało zresetowane bez Twojej wiedzy?Jednak zapewnia to tylko, że limit czasu połączenia (
wait_timeout
iinteractive_timeout
) nie wystąpi. Zgodnie z oczekiwaniami zakończy się niepowodzeniem we wszystkich innych scenariuszach. Dlatego pamiętaj o obsłudze innych błędów.źródło
Aby zasymulować zerwane połączenie, spróbuj
connection.destroy();
Więcej informacji tutaj: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections
źródło
Lepszym rozwiązaniem jest skorzystanie z basenu - źle sobie z tym poradzę.
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
źródło
Tworzenie i niszczenie połączeń w każdym zapytaniu może być skomplikowane, miałem kłopoty z migracją serwera, kiedy zdecydowałem się zainstalować MariaDB zamiast MySQL. Z jakiegoś powodu w pliku etc / my.cnf parametr wait_timeout miał domyślną wartość 10 sekund (powoduje to, że utrwalenia nie można zaimplementować). Następnie rozwiązanie zostało ustawione na 28800, czyli 8 godzin. Cóż, mam nadzieję, że pomogę komuś z tą "güevonada" ... przepraszam za mój słaby angielski.
źródło