ketika saya menggunakan node mysql, kesalahan muncul antara 12: 00-2: 00 bahwa koneksi TCP dimatikan oleh server. Ini adalah pesan lengkapnya:
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)
Ada solusinya . Namun setelah saya coba dengan cara ini, masalah juga muncul. sekarang saya tidak tahu bagaimana melakukannya. Apakah ada yang menemui masalah ini?
Berikut adalah cara saya menulis ikuti solusinya:
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
sumber
sumber
if (err.code !== 'PROTOCOL_CONNECTION_LOST') { console.log("PROTOCOL_CONNECTION_LOST"); throw err; }
. Anda menjalankanif()
blok jika tidakPROTOCOL_CONNECTION_LOST
, namun pesan mengatakan itu adalah kesalahan itu ... mungkin sangat membingungkan.Jawaban:
Coba gunakan kode ini untuk menangani pemutusan 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();
Dalam kode Anda, saya kehilangan bagian setelahnya
connection = mysql.createConnection(db_config);
sumber
Saya tidak ingat kasus penggunaan asli saya untuk mekanisme ini. Saat ini, saya tidak dapat memikirkan kasus penggunaan yang valid.
Klien Anda harus dapat mendeteksi saat koneksi terputus dan memungkinkan Anda membuat ulang koneksi. Jika penting bahwa bagian dari logika program dieksekusi menggunakan koneksi yang sama, maka gunakan transaksi.
tl; dr; Jangan gunakan metode ini.
Solusi pragmatis adalah memaksa MySQL untuk menjaga koneksi tetap hidup:
setInterval(function () { db.query('SELECT 1'); }, 5000);
Saya lebih suka solusi ini daripada kumpulan koneksi dan menangani pemutusan koneksi karena tidak perlu menyusun kode Anda dengan cara yang menyadari kehadiran koneksi. Membuat kueri setiap 5 detik memastikan bahwa koneksi akan tetap hidup dan
PROTOCOL_CONNECTION_LOST
tidak terjadi.Selanjutnya, metode ini memastikan bahwa Anda menjaga koneksi yang sama tetap hidup , bukan menghubungkan kembali. Ini penting. Pertimbangkan apa yang akan terjadi jika skrip Anda mengandalkan
LAST_INSERT_ID()
dan koneksi mysql telah disetel ulang tanpa Anda menyadarinya?Namun, ini hanya memastikan bahwa waktu koneksi habis (
wait_timeout
daninteractive_timeout
) tidak terjadi. Ini akan gagal, seperti yang diharapkan, di semua skenario lainnya. Oleh karena itu, pastikan untuk menangani kesalahan lainnya.sumber
Untuk mensimulasikan koneksi putus coba
connection.destroy();
Informasi lebih lanjut di sini: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections
sumber
solusi yang lebih baik adalah dengan menggunakan pool - sakit menangani ini untuk Anda.
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
sumber
node_modules/mysql/Readme.md
file yang disertakan dengan modul node MySQL.Membuat dan menghancurkan koneksi di setiap kueri mungkin rumit, saya mengalami sakit kepala dengan migrasi server ketika saya memutuskan untuk menginstal MariaDB, bukan MySQL. Untuk beberapa alasan di file etc / my.cnf parameter wait_timeout memiliki nilai default 10 detik (ini menyebabkan persistensi tidak dapat diimplementasikan). Kemudian, solusinya ditetapkan pada 28800, yaitu 8 jam. Yah, saya harap membantu seseorang dengan "güevonada" ini ... maafkan bahasa Inggris saya yang buruk.
sumber