Node-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

一个类似的项目,我目前的设置可以在这里看到: https : //github.com/hay-wire/NodeBootstrap/blob/master/models/UsersUtils.js

如果你能指出连接有什么问题,那将是非常好的。 谢谢。

UPDATE

由于node.js服务是在集群模式下运行,所以我想可能是线程竞争条件从共享连接池获取mysql连接资源是原因。 所以我closures了群集模式到单线程模式,连接超时停止。

但我不相信这是造成这个问题的竞争条件。 任何方式来validation这一点?

这种情况不时发生,默认的acquireTimeout有点低(10000ms),所以如果你有多个连接在运行,你应该增加它。 你可以在你的连接选项中设置它

 acquireTimeout: 1000000 var config = { host: '172.10.1.1', port: 3306, user: 'user', password: 'pwd', database: 'mydb', connectionLimit: 15, queueLimit: 30, acquireTimeout: 1000000 } 

这与超时无关。 我注意到了以下内容(如果您正在使用AWS Lambda函数,我认为这也适用于许多使用callback的情况)。

你正在调用connection.end(); 在它实际上发送COM_QUIT包到MySQL服务器closures连接之前。 所以下次你只要导入var mysql = require('mysql'); (至less在我的情况下)它会抛出一个超时错误,因为上一个连接似乎仍然打开您的机器,但实际上已被MySQLclosures。

请直接从终止连接文档中查看此链接

所以要解决这个问题,使用.destroy()而不是.end()

 connection.query(query, function(err, rows) { connection.destroy(); cb(err, rows); }); 

其他明智的使用.end()正确与callback如在:

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