什么可能的原因会导致nodejs中的mysql队列限制到达问题
我有一个nodeJs应用程序,它每分钟接收0-3000个请求(不规则、无模式)。大约80%-90%的请求导致mysql插入或更新操作 节点版本-4.2.2什么可能的原因会导致nodejs中的mysql队列限制到达问题,mysql,node.js,express,queue,restify,Mysql,Node.js,Express,Queue,Restify,我有一个nodeJs应用程序,它每分钟接收0-3000个请求(不规则、无模式)。大约80%-90%的请求导致mysql插入或更新操作 节点版本-4.2.2 Mysql版本-14.14发行版5.5.44,适用于使用readline 6.2的debian linux gnu(x86_64) 使用的nodejs框架是Restify 我从一个大小为20的mysql连接池中获取连接 我不时(偶尔)看到“mysql队列限制已达到”的问题。什么可能导致此问题?(除以下原因外) 连接未正确关闭 队列大小不足(如
Mysql版本-14.14发行版5.5.44,适用于使用readline 6.2的debian linux gnu(x86_64)
使用的nodejs框架是Restify 我从一个大小为20的mysql连接池中获取连接 我不时(偶尔)看到“mysql队列限制已达到”的问题。什么可能导致此问题?(除以下原因外)
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);
}
});
}
});
Edit2
这是我目前的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);
从性能角度来看,使用所谓的“连接池”是个好主意 连接池是维护数据库连接缓存的机制,以便在释放连接后可以重用连接。在
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);
您使用哪个框架连接节点中的mysql?连接太多会给您带来另一个错误,因此问题不大。队列大小似乎是连接mysql的nodejs框架的一个构造,如果我没有弄错的话,那么问题可能就在这里。我非常怀疑node或mysql是导致此问题的原因。我正在使用mysql nodejs驱动程序连接数据库。它似乎是最稳定和最受欢迎的驱动程序,是的,队列大小是驱动程序的一个构造函数,通过nodejs codec完成。您能在这里包含一些代码吗?就像驱动程序的初始配置和可能发生错误的函数一样?根据您的建议编辑了文章您使用哪个框架连接到节点中的mysql?连接太多会给您带来另一个错误,因此问题不大。队列大小似乎是连接mysql的nodejs框架的一个构造,如果我没有弄错的话,那么问题可能就在这里。我非常怀疑node或mysql是导致此问题的原因。我正在使用mysql nodejs驱动程序连接数据库。它似乎是最稳定和最受欢迎的驱动程序,是的,队列大小是驱动程序的一个构造函数,通过nodejs codec完成。您能在这里包含一些代码吗?就像驱动程序的初始配置和可能发生错误的函数一样?按照您的建议编辑帖子如何确定connectionLimit变量的值。仅供参考,max_connections系统变量设置为151(我认为这是默认值)。我甚至不知道max_connections系统变量的值应该是多少。你能解释一下吗?很难说,这取决于你的服务器负载。根据我的经验,一般来说,100到500之间的连接值足以满足低到中等的服务器负载。@pubudodangoda您必须不断考虑这个限制。如果你有很多慢查询和高流量,你需要更多的可用连接。如果你只有快速的查询,你可以用更少的查询来保证安全。现在,你为什么不允许无数的连接呢?好吧,你希望它尽可能接近你的实际极限,这样如果出了什么问题,它就会触发。例如,如果连接未正确关闭,查询需要花费非常长的时间才能完成,等等。这些情况下,您需要进一步调查,并且您不会轻易注意到上限。如何确定用于connectionLimit变量的值。仅供参考,max_connections系统变量设置为151(我认为这是默认值)。我甚至不知道max_connections系统变量的值应该是多少。你能解释一下吗?很难说,这取决于你的服务器负载。根据我的经验,一般来说,100到500之间的连接值足以满足低到中等的服务器负载。@pubudodangoda您必须不断考虑这个限制。如果你有很多慢查询和高流量,你需要更多的可用连接。如果你只有快速的查询,你可以用更少的查询来保证安全。现在,你为什么不允许无数的连接呢?好吧,你希望它尽可能接近你的实际极限,这样如果出了什么问题,它就会触发。例如,如果连接没有正确关闭,查询需要花费非常长的时间才能完成,等等。这些情况下,您需要进一步调查,并且您不会轻易注意到有很高的限制。