所以我最近经常收到这个错误。
Error: Connection lost: The server closed the connection.
at Protocol.end (/home/node_modules/mysql/lib/protocol/Protocol.js:$
at Socket.<anonymous> (/home/node_modules/mysql/lib/Connection.js:1$
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9)
我一直在寻找解决方案。我读了很多关于mysql pooling可以解决这个问题的信息,这已经有好几周了。该错误仍然弹出。有人知道为什么会这样吗?
我正在使用这个基本函数,该函数是我在Stackoverflow的答案中找到的。它可以处理我所有的查询
var mysql = require("mysql");
var config = require('./db');
var db = config.database;
var pool = mysql.createPool({
connectionLimit : 20,
host: db.host,
user: db.user,
password: db.password,
database: db.database
});
var DB = (function () {
function _query(query, params, callback) {
pool.getConnection(function (err, connection) {
if (err) {
connection.release();
callback(null, err);
throw err;
}
connection.query(query, params, function (err, rows) {
connection.release();
if (!err) {
callback(rows);
}
else {
callback(null, err);
}
});
connection.on('error', function (err) {
connection.release();
callback(null, err);
throw err;
});
});
};
return {
query: _query
};
})();
module.exports = DB;
我正在执行这样的查询:
DB.query("SELECT * FROM lists WHERE list_id = ?", [listId], function (result, err) {
console.log(result);
}
答案 0 :(得分:1)
MySQL服务器具有一个名为interactive_timeout
的变量,这意味着,如果您的连接空闲X秒钟,服务器将关闭该连接。
您可以稍微增加此值,但是首选方式是确认超时,如果需要查询某些内容,则只需使用池中的新连接即可。
请参见https://github.com/mysqljs/mysql#error-handling
连接池不会阻止任何超时,但是该池可确保您始终具有连接,或者如果您的应用程序负载很重,则可以具有多个连接。如果您的流量很少,那么您甚至不需要多个连接,因此甚至不需要连接池。
池中的每个连接都将超时,因为使用release()
不会关闭连接,而是将其返回给池。
因此,断开连接非常正常,您应该适当地处理错误。
将自动重新创建连接,请参见https://github.com/mysqljs/mysql#poolcluster-options
canRetry (Default: true)
If true, PoolCluster will attempt to reconnect when connection fails.
您如何正确处理该错误?
为所有MySQL错误准备通用错误处理程序:
// Above:
mySqlErrorHandler = function(error) {
if (error.code == '') { // <---- Insert in '' the error code, you need to find out
// Connection timeout, no further action (no throw)
} else {
// Oh, a different error, abort then
throw error;
}
}
// In the function:
connection.on('error', mySqlErrorHandler);
您需要找出error.code
来进行超时。可以通过console.log(error.code);
完成。