ER_CON_COUNT_ERROR: Too many connections error in node-mysql
ER_CON_COUNT_ERROR: Too many connections error in node-mysql
我是节点初学者。以下是我尝试使用节点 mysql 执行的代码,但它一直给我这个错误:
error connecting: Error: ER_CON_COUNT_ERROR: Too many connections
::代码::
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);
}
});
}
我应该如何重新设计上面的代码才能成功执行?
首先,您不需要 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 个同时连接。在你的情况下,你正在创建 ~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();
});
});
}
您还可以考虑使用单个连接并一次插入所有内容。您可以在 this 回答中看到如何实现。
使用后关闭连接即可。使用 connection.end();
我是节点初学者。以下是我尝试使用节点 mysql 执行的代码,但它一直给我这个错误:
error connecting: Error: ER_CON_COUNT_ERROR: Too many connections
::代码::
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);
}
});
}
我应该如何重新设计上面的代码才能成功执行?
首先,您不需要 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 个同时连接。在你的情况下,你正在创建 ~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();
});
});
}
您还可以考虑使用单个连接并一次插入所有内容。您可以在 this 回答中看到如何实现。
使用后关闭连接即可。使用 connection.end();