web-dev-qa-db-ja.com

nodejs mysqlエラー:接続が失われましたサーバーは接続を閉じました

ノードmysqlを使用すると、12:00から2:00の間にサーバーによってTCP接続がシャットダウンされるというエラーが表示されます。これは完全なメッセージです。

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();
73
jackieLin

このコード を使用してサーバーの切断を処理してみてください。

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);の後の部分が欠落しています

131
CloudyMarble

このメカニズムの元のユースケースは思い出せません。現在、有効なユースケースは考えられません。

クライアントは、接続が失われたことを検出し、接続を再作成できるようにする必要があります。プログラムロジックの一部が同じ接続を使用して実行されることが重要な場合は、トランザクションを使用します。

tl; dr;この方法は使用しないでください。


実用的な解決策は、MySQLが接続を維持するように強制することです。

setInterval(function () {
    db.query('SELECT 1');
}, 5000);

接続の存在を意識した方法でコードを構成する必要がないため、接続プールと切断の処理よりもこのソリューションの方が好きです。 5秒ごとにクエリを作成することにより、接続が維持され、PROTOCOL_CONNECTION_LOSTが発生しないことが保証されます。

さらに、このメソッドは、再接続ではなく、同じ接続を維持しているを保証します。これは重要。スクリプトがLAST_INSERT_ID()に依存しており、mysql接続が意識せずにリセットされた場合にどうなるかを考えてください。

ただし、これにより、接続タイムアウト(wait_timeoutおよびinteractive_timeout)が発生しないことが保証されます。他のすべてのシナリオでは、予想どおり失敗します。したがって、必ず他のエラーを処理してください。

39
Gajus

接続の切断をシミュレートするには

connection.destroy();

詳細はこちら: https://github.com/felixge/node-mysql/blob/master/Readme.md#terminating-connections

4
Simon Fearby

MySQLの代わりにMariaDBをインストールすることに決めたとき、各クエリで接続の作成と破棄が複雑になる可能性があり、サーバーの移行に頭痛の種がありました。ファイルetc/my.cnfの何らかの理由で、パラメータwait_timeoutのデフォルト値は10秒でした(永続性を実装できない原因になります)。次に、ソリューションは28800、つまり8時間で設定されました。まあ、私はこの「güevonada」で誰かを助けることを願っています...私の悪い英語のためにすみません。

1
Aleks Towers