ER CON COUNT ERROR: слишком много ошибок соединений в узле-mysql
Я начинающий узел. Ниже приведен код, который я пытаюсь выполнить с помощью узла mysql, но он продолжает давать мне эту ошибку:
error connecting: Error: ER_CON_COUNT_ERROR: Too many connections
:: CODE::
var size = item.length;// size is ~1500
for (var i=0; i<size;i++) {
var connection = mysql.createConnection({
host : 'xxx.xxx.xxx.xxx',
database : 'mydb',
user : 'test',
password : 'test'
});
connection.connect(function(err, callback) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
});
var entry = {
id: item[i],
time_created: Math.floor(Date.now() / 1000),
time_created: Math.floor(Date.now() / 1000),
price_range: 0
};
var query = connection.query('INSERT INTO mytable SET ?', entry, function(err, result, callback) {
if(err) {
console.log(err.message);
}
});
connection.end(function(err) {
if(err) {
console.log(err.message);
}
});
}
Как мне перепроектировать приведенный выше код для его успешного выполнения?
2 ответов
сначала вам не нужно 1500 соединений для вставки 1500 элементов. Удалите этот код из цикла for.
что-то вроде этого:
var size = item.length;// size is ~1500
var connection = mysql.createConnection({
host : 'xxx.xxx.xxx.xxx',
database : 'mydb',
user : 'test',
password : 'test'
});
connection.connect(function(err, callback) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
});
connection.end(function(err) {
if(err) {
console.log(err.message);
}
});
for (var i=0; i<size;i++) {
var entry = {
id: item[i],
time_created: Math.floor(Date.now() / 1000),
time_created: Math.floor(Date.now() / 1000),
price_range: 0
};
var query = connection.query('INSERT INTO mytable SET ?', entry, function(err, result, callback) {
if(err) {
console.log(err.message);
}
});
};
MySQL по умолчанию принимает только 100 одновременных подключений max. В вашем случае вы создаете ~1500, поэтому ошибка, которую вы получаете, является нормальной. Вы можете увеличить это значение, но проблема вот в коде.
вместо этого вы должны использовать бассейн. Это заставит узел создать пул соединений (я думаю, что по умолчанию 10) и пусть они будут разделены вашими запросами:
var mysql = require('mysql');
var pool = mysql.createPool({
host : 'xxx.xxx.xxx.xxx',
database : 'mydb',
user : 'test',
password : 'test'
});
for (var i=0; i<size;i++) {
pool.getConnection(function(err, connection) {
connection.query( 'INSERT INTO ...', function(err, rows) {
connection.release();
});
});
}
также вы можете рассмотреть возможность использования одного подключения и вставить все сразу. Вы можете видеть в этой ответьте, как этого достичь.