ノード mysql ライブラリを使用して、EC2 の node.js アプリで発生している MySQL エラーを再現しようとしています。
接続が失われました: サーバーが接続を閉じました。
エラーをローカルで再現することはできません。データベースの強制終了は私のコードで問題なく処理されます。数秒ごとに再チェックし、再起動するとデータベースに再接続します。EC2 では、太平洋時間の午前 4 時頃に発生しますが、データベースはまだ正常に稼働しています。
そうしたいです。
- ローカル mysql でクラッシュを再現する
- これを処理するために必要なロジックを mysql ヘルパー モジュールに追加します。
私のnode.jsアプリのエラーは次のとおりです。
2012-10-22T08:45:40.518Z - エラー: uncaughtException date=Mon Oct 22 2012 08:45:40 GMT+0000 (UTC)、pid=14184、uid=0、gid=0、cwd=/home/ec2 -user/my-app, execPath=/usr/bin/nodejs, version=v0.6.18, argv=[/usr/local/bin/node, /home/ec2-user/my-app/app.js, - -my-app]、rss=15310848、heapTotal=6311392、heapUsed=5123292、loadavg=[0.0029296875、0.0146484375、0.04541015625]、uptime=3238343.511107486、ec trace=[column=13、2=my-user/home/ app/node_modules/mysql/lib/protocol/Protocol.js, function=Protocol.end, line=63, method=end, native=false, column=10, file=stream.js, function=Socket.onend, line= 80、メソッド=onend、ネイティブ=false、列=20、ファイル=events.js、関数=Socket.emit、行=88、メソッド=発行、ネイティブ=false、列=51、ファイル=net.js、関数= TCP.onread、行 = 388、メソッド = onread、ネイティブ = false]、スタック = [エラー: 接続が失われました:サーバーが接続を閉じました。,
Protocol.end (/home/ec2-user/my-app/node_modules/mysql/lib/protocol/Protocol.js:63:13)、Socket.onend (stream.js:80:10)、Socket.エミット (events.js:88:20)、TCP.onread (net.js:388:51) で]
これが私のコードです(mysqlヘルパーモジュール):
module.exports = function (conf,logger) {
var mysql = require('mysql');
var connectionState = false;
var connection = mysql.createConnection({
host: conf.db.hostname,
user: conf.db.user,
password: conf.db.pass,
database: conf.db.schema,
insecureAuth: true
});
function attemptConnection(connection) {
if(!connectionState){
connection = mysql.createConnection(connection.config);
connection.connect(function (err) {
// connected! (unless `err` is set)
if (err) {
logger.error('mysql db unable to connect: ' + err);
connectionState = false;
} else {
logger.info('mysql connect!');
connectionState = true;
}
});
connection.on('close', function (err) {
logger.error('mysqldb conn close');
connectionState = false;
});
connection.on('error', function (err) {
logger.error('mysqldb error: ' + err);
connectionState = false;
/*
if (!err.fatal) {
return;
}
if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
throw err;
}
*/
});
}
}
attemptConnection(connection);
var dbConnChecker = setInterval(function(){
if(!connectionState){
logger.info('not connected, attempting reconnect');
attemptConnection(connection);
}
}, conf.db.checkInterval);
return connection;
};