quando eu uso o node mysql, aparece um erro entre 12h00 e 2h00 que a conexão TCP foi desligada pelo servidor. Esta é a mensagem completa:
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)
Essa é a solução . Porém, depois de tentar dessa forma, o problema também apareceu. agora não sei como fazer. Alguém conhece esse problema?
Aqui está o jeito que escrevi seguir a solução:
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
fonte
fonte
if (err.code !== 'PROTOCOL_CONNECTION_LOST') { console.log("PROTOCOL_CONNECTION_LOST"); throw err; }
. Você executar oif()
bloco se for nãoPROTOCOL_CONNECTION_LOST
e ainda a mensagem diz que é esse erro ... provavelmente muito confuso.Respostas:
Tente usar este código para lidar com a desconexão do servidor:
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();
No seu código estou faltando as partes depois
connection = mysql.createConnection(db_config);
fonte
Não me lembro de meu caso de uso original para esse mecanismo. Hoje em dia, não consigo pensar em nenhum caso de uso válido.
Seu cliente deve ser capaz de detectar quando a conexão é perdida e permitir que você recrie a conexão. Se for importante que parte da lógica do programa seja executada usando a mesma conexão, use as transações.
tl; dr; Não use este método.
Uma solução pragmática é forçar o MySQL a manter a conexão ativa:
setInterval(function () { db.query('SELECT 1'); }, 5000);
Eu prefiro esta solução para pool de conexão e tratamento de desconexão porque não requer estruturar seu código de uma forma que esteja ciente da presença de conexão. Fazer uma consulta a cada 5 segundos garante que a conexão permanecerá ativa e
PROTOCOL_CONNECTION_LOST
não ocorrerá.Além disso, esse método garante que você mantenha a mesma conexão ativa , em vez de reconectar. Isso é importante. Considere o que aconteceria se seu script dependesse de
LAST_INSERT_ID()
e a conexão do mysql fosse redefinida sem você saber disso?No entanto, isso apenas garante que o tempo limite de conexão (
wait_timeout
einteractive_timeout
) não ocorra. Ele falhará, como esperado, em todos os outros cenários. Portanto, certifique-se de lidar com outros erros.fonte
Para simular uma queda de conexão, tente
connection.destroy();
Mais informações aqui: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections
fonte
a melhor solução é usar piscina - cuidarei disso para você.
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
fonte
node_modules/mysql/Readme.md
arquivo que vem com o módulo de nó MySQL.Criar e destruir as conexões em cada consulta pode ser complicado, tive algumas dores de cabeça com a migração do servidor quando decidi instalar o MariaDB em vez do MySQL. Por alguma razão no arquivo etc / my.cnf o parâmetro wait_timeout tinha um valor padrão de 10 seg (isso faz com que a persistência não possa ser implementada). Então, a solução foi acertada em 28800, são 8 horas. Bem, espero ajudar alguém com essa "güevonada" ... desculpe-me pelo meu péssimo inglês.
fonte