Слишком много подключений на Node-MySQL - PullRequest
0 голосов
/ 16 января 2019

Я получаю сообщение об ошибке Too many connections, когда много циклов с INSERT IGNORE INTO.

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 раз ВСТАВЬТЕ 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() вызывается при старте узла

1 Ответ

0 голосов
/ 16 января 2019

Вы установили connectionLimit на пять тысяч! Это означает, что подсистема node-mysql будет пытаться обрабатывать несколько запросов, добавляя новые соединения, пока их не станет пять тысяч. Кажется, ваш MySQL-сервер имеет ограничение на соединение в 100, поэтому ваше приложение nodejs отключается при достижении этого лимита.

Набор connectionLimit: 10,

Тогда вы будете использовать десять подключений к пулу, и когда они все будут использоваться, ваши pool.query вызовы будут ждать, пока одно из них не станет доступным.

Почему бы не установить ограничение на 100? Две причины:

  1. Вы хотите оставить некоторые подключения MySQL для другого клиентского программного обеспечения.
  2. Если вы забьете базу данных множеством аналогичных запросов (в вашем случае запросов INSERT) параллельно, это потратит время, избегая конфликтов. При меньшем количестве параллельных соединений каждый запрос будет выполняться намного быстрее.
...