哪些可能的原因会导致 nodejs 中的 mysql 队列限制到达问题
What possible reasons can cause mysql queue limit reach issue in nodejs
我有一个 nodeJs 应用程序,它每分钟接收 0-3000 个请求(不规则,无模式)。大约 80%-90% 的请求导致 mysql 插入或更新操作。
节点版本 - 4.2.2
Mysql 版本 - 14.14 Distrib 5.5.44,用于 debian-linux-gnu (x86_64) 使用 readline 6.2
使用的nodejs框架是Restify
我正在从大小为 20 的 mysql 连接池获取连接。
我时常(偶尔)看到 "mysql queue limit reached" 问题。什么可能导致此问题?(除以下原因外)
- 连接未正确关闭
- 队列大小不够(如何确定最佳队列大小?)
- nodejs 或 mysql 版本有问题(可以使用什么版本来解决这个问题?)
- mysql 查询中的问题(与此问题相关的查询可能存在哪些问题?)
- 使用nodejs框架的问题(用expressJs能解决吗?)
编辑1
这是我如何查询数据库的框架
connectionPool.getConnection(function (err, conn) {
if (err) {
return callback(err);
} else {
let args = [param1, param2];
let query = "SELECT...";
conn.query(query, args, function (err, rows) {
conn.release();
if (err) {
return callback(err);
} else {
return callback(null, rows);
}
});
}
});
编辑2
这是我目前拥有的 mysql 配置。我对这些价值观不太了解。他们还好吗?
{
"connectionLimit": 10,
"acquireTimeout": 60000,
"host": "*****",
"port": "3306",
"user": "*****",
"password": "****",
"database": "*****",
"charset": "UTF8_GENERAL_CI",
"debug": false,
"waitForConnections" : true,
"queueLimit" : 15000
}
从性能的角度来看,使用所谓的“连接池”是个好主意。
连接池是一种维护数据库连接缓存的机制,以便在释放连接后可以重新使用连接。在 Node.js
MySQL 中,可以直接使用池来处理多个连接 更重要的是 - 重用连接 。例如:
var express = require("express");
var mysql = require('mysql');
var app = express();
var pool = mysql.createPool({
connectionLimit : 100, //important
host : 'localhost',
user : '***',
password : '***',
database : 'database_name',
debug : false
});
function db_connect(req,res) {
pool.getConnection(function(err,connection){
if (err) {
res.json({"code" : "error", "status" : "Error in database connection."});
return;
}
console.log('Connection ID: ' + connection.threadId);
connection.query("SELECT * FROM `table1`",function(err,rows){
connection.release();
if(!err) {
res.json(rows);
}
});
connection.on('error', function(err) {
res.json({"code" : "error", "status" : "Error in database connection."});
return;
});
});
}
app.get("/",function(req,res){
db_connect(req,res);
});
//Run on port 3000
app.listen(3000);
我有一个 nodeJs 应用程序,它每分钟接收 0-3000 个请求(不规则,无模式)。大约 80%-90% 的请求导致 mysql 插入或更新操作。
节点版本 - 4.2.2
Mysql 版本 - 14.14 Distrib 5.5.44,用于 debian-linux-gnu (x86_64) 使用 readline 6.2
使用的nodejs框架是Restify
我正在从大小为 20 的 mysql 连接池获取连接。
我时常(偶尔)看到 "mysql queue limit reached" 问题。什么可能导致此问题?(除以下原因外)
- 连接未正确关闭
- 队列大小不够(如何确定最佳队列大小?)
- nodejs 或 mysql 版本有问题(可以使用什么版本来解决这个问题?)
- mysql 查询中的问题(与此问题相关的查询可能存在哪些问题?)
- 使用nodejs框架的问题(用expressJs能解决吗?)
编辑1 这是我如何查询数据库的框架
connectionPool.getConnection(function (err, conn) {
if (err) {
return callback(err);
} else {
let args = [param1, param2];
let query = "SELECT...";
conn.query(query, args, function (err, rows) {
conn.release();
if (err) {
return callback(err);
} else {
return callback(null, rows);
}
});
}
});
编辑2 这是我目前拥有的 mysql 配置。我对这些价值观不太了解。他们还好吗?
{
"connectionLimit": 10,
"acquireTimeout": 60000,
"host": "*****",
"port": "3306",
"user": "*****",
"password": "****",
"database": "*****",
"charset": "UTF8_GENERAL_CI",
"debug": false,
"waitForConnections" : true,
"queueLimit" : 15000
}
从性能的角度来看,使用所谓的“连接池”是个好主意。
连接池是一种维护数据库连接缓存的机制,以便在释放连接后可以重新使用连接。在 Node.js
MySQL 中,可以直接使用池来处理多个连接 更重要的是 - 重用连接 。例如:
var express = require("express");
var mysql = require('mysql');
var app = express();
var pool = mysql.createPool({
connectionLimit : 100, //important
host : 'localhost',
user : '***',
password : '***',
database : 'database_name',
debug : false
});
function db_connect(req,res) {
pool.getConnection(function(err,connection){
if (err) {
res.json({"code" : "error", "status" : "Error in database connection."});
return;
}
console.log('Connection ID: ' + connection.threadId);
connection.query("SELECT * FROM `table1`",function(err,rows){
connection.release();
if(!err) {
res.json(rows);
}
});
connection.on('error', function(err) {
res.json({"code" : "error", "status" : "Error in database connection."});
return;
});
});
}
app.get("/",function(req,res){
db_connect(req,res);
});
//Run on port 3000
app.listen(3000);