gpt4 book ai didi

javascript - Node-Mysql抛出连接超时

转载 作者:可可西里 更新时间:2023-11-01 06:37:07 25 4
gpt4 key购买 nike

由于随机连接超时,我的 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);
});
};

但是两种设置都给错误:连接 ETIMEDOUT在 Connection._handleConnectTimeout

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

如果您能指出连接可能出现的问题,那就太好了。谢谢。

更新

由于 node.js 服务在集群模式下运行,我认为可能是跨线程从共享连接池获取 mysql 连接资源的竞争条件是原因。所以我将集群模式切换为单线程模式并停止连接超时。

我仍然不相信这是导致此问题的竞争条件。有什么方法可以验证吗?

最佳答案

这与超时无关。我注意到以下几点(如果您在 AWS Lambda 函数之类的东西中使用它,我认为这也适用于许多带有回调的情况)。

您在 connection.end(); 实际发送 COM_QUIT 数据包到 MySQL 服务器以关闭连接之前调用它。所以下次你只是 import 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);
});
});

关于javascript - Node-Mysql抛出连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32715273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com