Node-MySQL 上的连接过多

问题描述 投票:0回答:2

当使用 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 多个案例时,100 次 INSERT IGNORE INTO 比我得到了太多的连接。我不知道具体崩溃了多少,但是 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()
在节点启动时调用

mysql connection-pooling node-mysql
2个回答
18
投票

您已将

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

设置

connectionLimit: 10,

然后您将使用十个池连接,当它们全部使用时,您的

pool.query
调用将等待,直到有一个可用为止。

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

  1. 您想为其他客户端软件保留一些 MySQL 连接。
  2. 如果您使用许多类似的查询(在您的情况下是 INSERT 查询)并行地锤击数据库,它将花费时间来避免争用。由于并行连接较少,每个查询将更快地完成。

0
投票

您在这一行遇到问题

pool = mysql.createPool(db_config);

您应该像这样在 db_config 变量中调用 createPool() :

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

并在你的函数中使用它:

function database_connection() {
var pool = 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!');
    }
});

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.