节点的Mysql抛连接超时
我的Node.js应用程序,让5XX由于连接超时在随机时间。下面是我连接和查询:
var mysql = require('mysql');
var config = {
host: '172.10.1.1',
port: 3306,
user: 'user',
password: 'pwd',
database: 'mydb',
connectionLimit: 15,
queueLimit: 30
}
var poolCluster = mysql.createPool(config);
var queryDB = function(query, cb) {
poolCluster.getConnection(function(err, connection) {
if(err) {
cb(err, null);
}
else {
connection.query(query, function (err, rows) {
connection.release();
cb(err, rows);
});
}
});
};
而且,在另一个替换版本中,与连接池禁用,代码看起来是这样的:
queryDB = function(query, cb) {
var connection = mysql.createConnection(config);
connection.query(query, function(err, rows) {
connection.end();
cb(err, rows);
});
};
然而无论是设置给错误:在Connection._handleConnectTimeout连接ETIMEDOUT
类似的项目,以我目前的设置可以在这里看到:.js
这将是巨大的,如果你能指出这可能是走错了与连接。谢谢。
UPDATE
由于Node.js的服务在集群模式下运行,我想也许一个竞争条件在整个线程从共享连接池中获得MySQL连接资源的原因。所以我关掉了集群模式为单线程模式,连接超时停止。
不过我不相信这是造成这一问题的竞争条件。任何方式来验证这一点?
回答如下:这有什么好做的超时。我注意到下面的(如果你是在像AWS lambda函数使用它,我认为这也适用于许多情况下与回调)。
您呼叫的connection.end();
实际发送的数据包COM_QUIT之前,MySQL服务器关闭连接。因此,下一次你刚才导入var mysql = require('mysql');
(在我的情况下,至少)作为前一连接似乎仍然开放给你的机器,但实际上是由MySQL的关闭,它将引发超时错误。
请参阅this link from directly from the documentation on terminating connections
因此,要解决这种情况使用.destroy()
代替.end()
。
connection.query(query, function(err, rows)
{
connection.destroy();
cb(err, rows);
});
其他明智地使用.end()
与回调中正确:
connection.query(query, function(err, rows)
{
connection.end(function(errCon) //Don't do anything with end Error
{
// The connection is terminated now
cb(err, rows);
});
});