【问题标题】:Node-Mysql throwing connection timeoutNode-Mysql 抛出连接超时
【发布时间】:2019-11-14 17:26:15
【问题描述】:

由于随机连接超时,我的 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 连接资源的竞争条件是原因。所以我将集群模式关闭为单线程模式,连接超时停止。

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

【问题讨论】:

  • 每个查询平均需要多长时间?
  • @schtever:时间非常少..大约几毫秒
  • 你好,我也有类似的问题,是不是也跟CPU增加问题有关?

标签: javascript mysql node.js amazon-rds node-mysql


【解决方案1】:

这与超时无关。我注意到以下情况(如果您在 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);
    });           
});

【讨论】:

  • 谢谢,这正是我在使用 AWS Lambda 时遇到的问题。
  • 本地 MariaDB 实例有同样的问题。 'conn.end()' 可以解决问题。
  • @MauricioAvendaño 我也遇到了 Lambda 问题,但仍然无法解决问题。你是怎么做到的?如果需要,您还可以在我的 SO 问题下发布答案:stackoverflow.com/questions/71513849/…。谢谢
【解决方案2】:

这种情况时有发生,默认的 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
}

【讨论】:

  • 我知道为什么它会时不时发生!一定有什么原因吧?
  • 好问题,在 github 上有一个更长的讨论关于它没有真正的答案。我会说这可能是由于网络延迟或其他原因。 @haywire。我正在使用具有 5000 个连接池的 node-mysql 并且由于我增加了超时时间而没有遇到问题。然后我不再试图找到原因的答案......
  • 大声笑!顺便说一句,您是使用 node.js 的集群模式还是仅使用单线程模式? PS:我已经更新了这个参考中的问题。
  • 整个应用是集群的,但不使用池集群@haywire
【解决方案3】:

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

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() 方法来解决这个问题。现在工作正常。

【讨论】:

  • 删除 con.connect 会阻止 mysql 尝试连接到 MYSQL 服务器,所以它当然会阻止这个问题。
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 2011-12-25
  • 2016-08-04
  • 2011-02-05
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多