最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

节点的Mysql抛连接超时

运维笔记admin17浏览0评论

节点的Mysql抛连接超时

节点的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

类似的项目,以我目前的设置可以在这里看到:.js

这将是巨大的,如果你能指出这可能是走错了与连接。谢谢。

UPDATE

由于Node.js的服务在集群模式下运行,我想也许一个竞争条件在整个线程从共享连接池中获得MySQL连接资源的原因。所以我关掉了集群模式为单线程模式,连接超时停止。

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

回答如下:

这有什么好做的超时。我注意到下面的(如果你是在像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);
    });           
});

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论