[mysql] nodejs mysql 오류 : 연결이 끊어졌습니다. 서버가 연결을 닫았습니다.

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_timeoutinteractive_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) => { /* */ });

https://github.com/sidorares/node-mysql2/issues/836


답변

각 쿼리에서 연결을 만들고 파괴하는 것은 복잡 할 수 있습니다. MySQL 대신 MariaDB를 설치하기로 결정했을 때 서버 마이그레이션에 약간의 골칫거리가있었습니다. etc / my.cnf 파일에서 어떤 이유로 wait_timeout 매개 변수의 기본값은 10 초입니다 (지속성을 구현할 수 없음). 그런 다음 솔루션은 28800, 즉 8 시간으로 설정되었습니다. 글쎄, 나는이 “güevonada”로 누군가를 돕길 바랍니다 … 나의 나쁜 영어에 대해 실례합니다.


답변