nodejs mysql错误:连接丢失服务器closures了连接

当我使用节点mysql时,在12:00到2:00之间出现TCP连接被服务器closures的错误。 这是完整的信息:

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) 

有解决scheme 。 但是,我这样试后,问题也出现了。 现在我不知道该怎么办。 有没有人遇到这个问题?

这是我写的方式遵循的解决scheme:

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

在你的代码中,我缺lessconnection = mysql.createConnection(db_config);后的部分connection = mysql.createConnection(db_config);

一个实用的解决scheme是强制MySQL保持连接活着:

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

我更喜欢连接池和处理断开连接的解决scheme,因为它不需要以意识到连接存在的方式来构造代码。 每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

创build和销毁每个查询中的连接可能很复杂,当我决定安装MariaDB而不是MySQL时,我有一些服务器迁移的麻烦。 出于某种原因,在文件etc / my.cnf中,参数wait_timeout的默认值是10秒(这导致持久性无法实现)。 然后,解决scheme被设置在28800,这是8小时。 那么,我希望能帮助这个“güevonada”的人…对不起我的英文不好。