Javascript 节点连接超时

Javascript 节点连接超时,javascript,mysql,node.js,amazon-rds,node-mysql,Javascript,Mysql,Node.js,Amazon Rds,Node Mysql,我的node.js应用程序由于随机时间的连接超时而提供5xx。以下是我连接和查询的方式: var mysql = require('mysql'); var config = { host: '172.10.1.1', port: 3306, user: 'user', password: 'pwd', database: 'mydb', conne

我的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 在连接时。\u handleConnectTimeout

此处可以看到与我当前设置类似的项目:

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

更新

由于node.js服务是在集群模式下运行的,所以我认为可能是线程之间的竞争条件导致了从共享连接池获取mysql连接资源。因此,我将群集模式关闭为单线程模式,连接超时停止。


我仍然不相信是比赛条件导致了这个问题。有没有办法验证这一点?

如果经常发生这种情况,默认的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函数中使用它,我认为这也适用于许多回调情况)

您正在调用
连接.end()
在它实际将COM_QUIT数据包发送到MySQL服务器以关闭连接之前。因此,下次您只需导入
var mysql=require('mysql')
(至少在我的情况下)它会抛出一个超时错误,因为之前的连接似乎对您的机器仍然打开,但实际上已经被MySQL关闭

请看

因此,要解决此问题,请使用
.destroy()
而不是
.end()

其他明智的做法是在回调中正确使用
.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);
    });           
});

在执行以下代码时,我还遇到了连接超时错误

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  port:"3307",
  user: "root",
  password: "root",
  database:"nodedb"
});


/*
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
});
*/
module.exports=con;

我删除了con.connect()方法来解决此问题。现在很好用

每个查询平均需要多长时间?@schtever:时间非常少。。大约几毫秒Shello,因为我有一个类似的问题,它是否也与CPU问题增加有关?我想知道为什么它会经常发生!一定有什么原因吗?好问题,github上对此进行了较长时间的讨论,但没有给出真正的答案。我想这可能是由于网络延迟或其他原因@失控的我正在使用带有5000个连接池的节点mysql,由于我增加了超时时间,所以没有遇到这个问题。然后我就不再试图找到答案,为什么…哈哈!顺便问一下,您是在node.js中使用集群模式还是仅使用单线程模式?PS:我已经更新了参考资料中的问题。整个应用程序都是集群的,但没有使用pool clustering@haywireThank,这正是我在使用AWS Lambda时遇到的问题。MariaDB的本地实例也有同样的问题。”conn.end()'会起作用。删除con.connect会阻止mysql尝试连接到mysql服务器,因此它当然会防止出现问题。
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  port:"3307",
  user: "root",
  password: "root",
  database:"nodedb"
});


/*
con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
});
*/
module.exports=con;