节点MySQL上的连接过多

时间:2019-01-16 13:34:30

标签: mysql connection-pooling node-mysql

在使用INSERT IGNORE INTO循环中有很多项目时,出现错误Too many connections

function insertCases(cases) {
    for(var i in cases) {
        var thequery = 'INSERT IGNORE INTO `cases` SET keysused='+cases.keysused+' 
        pool.query(thequery, function(ee, rr) {
            if(ee) {
                logger.info(ee);
                throw ee;
            }
        });
    }
}

如果现在有100多个案例,那么INSERT IGNORE INTO的数量是我获得太多连接的100倍。我不知道它到底有多少崩溃,但是可以正常工作100次。

我读到的是,该查询运行该查询,并在完成后关闭连接,所以我读到,然后我不需要关闭它。

如果我运行100,等待很短的时间,然后再次运行100,依此类推,它不会出现太多连接错误。

只有一次运行这么多时间时,它才会出现。

那是我的数据库设置

var db_config = {
    connectionLimit : 5000,
    host: 'localhost',
    user: 'userexample'
    password: '*******',
    database: 'example.com'
};

这就是createPool的功能。

function database_connection() {
pool = mysql.createPool(db_config);
pool.getConnection(function(err, connection) {
    if(err) {
        logger.error('[ERROR] Connecting to database "' + err.toString() + '"');
        setTimeout(function() { database_connection(); }, 2500);
    }
    else
    {
        pool.query('SET NAMES utf8');
        pool.query('SET CHARACTER SET utf8');
        logger.trace('[INFO] Connected to database and set utf8!');
    }
});

}

只需使用pool.query

运行节点上的所有查询

在节点开始时调用database_connection()

1 个答案:

答案 0 :(得分:3)

您已将connectionLimit设置为五千!这意味着,node-mysql子系统将继续尝试通过添加新连接来处理多个查询请求,直到拥有五千个为止。看来您的MySQL服务器的连接限制为100,因此达到该限制时,您的nodejs应用就会崩溃。

设置connectionLimit: 10,

然后,您将使用十个池连接,当它们全部使用时,您的pool.query调用将等到一个可用。

为什么不将限制设置为100?两个原因:

  1. 您想为其他客户端软件保留一些MySQL连接。
  2. 如果同时并行处理许多类似查询(在您的情况下为INSERT查询),这将花费时间避免争用。如果并行连接较少,则每个查询将更快地完成。