节点上的连接太多-MySQL
Too many Connections on 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()
您已将 connectionLimit
设置为五千!这意味着 node-mysql 子系统将继续尝试通过添加新连接来处理多个查询请求,直到它有 5000 个。您的 MySQL 服务器似乎有 100 个连接限制,因此当达到该限制时您的 nodejs 应用程序就会崩溃。
设置connectionLimit: 10,
然后您将使用 10 个池连接,当它们都在使用时,您的 pool.query
调用将等待一个可用。
为什么不将限制设置为 100?两个原因:
- 您想为其他客户端软件保留一些 MySQL 连接。
- 如果你用许多类似的查询(在你的例子中是 INSERT 查询)并行地敲击数据库,它会花时间避免争用。使用较少的并行连接,每个查询将完成得更快。
当使用 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()
您已将 connectionLimit
设置为五千!这意味着 node-mysql 子系统将继续尝试通过添加新连接来处理多个查询请求,直到它有 5000 个。您的 MySQL 服务器似乎有 100 个连接限制,因此当达到该限制时您的 nodejs 应用程序就会崩溃。
设置connectionLimit: 10,
然后您将使用 10 个池连接,当它们都在使用时,您的 pool.query
调用将等待一个可用。
为什么不将限制设置为 100?两个原因:
- 您想为其他客户端软件保留一些 MySQL 连接。
- 如果你用许多类似的查询(在你的例子中是 INSERT 查询)并行地敲击数据库,它会花时间避免争用。使用较少的并行连接,每个查询将完成得更快。