繁体   English   中英

Node-Mysql 抛出连接超时

[英]Node-Mysql throwing connection timeout

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

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

更新

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

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

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

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

直接从有关终止连接的文档中查看此链接

所以要解决这个问题,请使用.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);
    });           
});

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

acquireTimeout: 1000000

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM