mysql 노드를 사용할 때 서버에 의해 TCP 연결이 종료되었다는 오류가 12:00에서 2:00 사이에 나타납니다. 다음은 전체 메시지입니다.
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)
이 솔루션은 . 그런데 이렇게 해보면 문제도 나옵니다. 지금은 어떻게해야할지 모르겠습니다. 누구든지이 문제를 충족합니까?
솔루션을 따르는 방법은 다음과 같습니다.
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();
답변
이 코드 를 사용 하여 서버 연결 해제를 처리하십시오.
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();
귀하의 코드에서 나는 부품이 누락되었습니다. connection = mysql.createConnection(db_config);
답변
이 메커니즘에 대한 원래 사용 사례를 기억하지 않습니다. 요즘에는 유효한 사용 사례를 생각할 수 없습니다.
클라이언트는 연결이 끊어진시기를 감지하고 연결을 다시 만들 수 있어야합니다. 프로그램 로직의 일부가 동일한 연결을 사용하여 실행되는 것이 중요하다면 트랜잭션을 사용하십시오.
tl; dr; 이 방법을 사용하지 마십시오.
실용적인 해결책은 MySQL이 연결을 유지하도록하는 것입니다.
setInterval(function () {
db.query('SELECT 1');
}, 5000);
연결 상태를 인식하는 방식으로 코드를 구성 할 필요가 없기 때문에 연결 풀 및 연결 해제 처리보다이 솔루션을 선호합니다. 5 초마다 쿼리를 작성하면 연결이 활성 상태로 유지되고 PROTOCOL_CONNECTION_LOST
발생하지 않습니다.
또한이 방법을 사용하면 다시 연결하는 대신 동일한 연결을 유지하고 있습니다. 이것은 중요하다. 스크립트에 의존 LAST_INSERT_ID()
하고 mysql 연결이 자신도 모르게 재설정 된 경우 어떻게 될지 생각해보십시오 .
그러나 이렇게하면 연결 시간 초과 ( wait_timeout
및 interactive_timeout
)가 발생하지 않을 뿐입니다 . 예상대로 다른 모든 시나리오에서는 실패합니다. 따라서 다른 오류를 처리해야합니다.
답변
끊어진 연결을 시뮬레이션하려면
connection.destroy();
자세한 정보 : https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections
답변
더 나은 해결책은 풀을 사용하는 것입니다.
const pool = mysql.createPool({
host: 'localhost',
user: '--',
database: '---',
password: '----'
});
// ... later
pool.query('select 1 + 1', (err, rows) => { /* */ });
답변
각 쿼리에서 연결을 만들고 파괴하는 것은 복잡 할 수 있습니다. MySQL 대신 MariaDB를 설치하기로 결정했을 때 서버 마이그레이션에 약간의 골칫거리가있었습니다. etc / my.cnf 파일에서 어떤 이유로 wait_timeout 매개 변수의 기본값은 10 초입니다 (지속성을 구현할 수 없음). 그런 다음 솔루션은 28800, 즉 8 시간으로 설정되었습니다. 글쎄, 나는이 “güevonada”로 누군가를 돕길 바랍니다 … 나의 나쁜 영어에 대해 실례합니다.