哪些可能的原因会导致 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" 问题。什么可能导致此问题?(除以下原因外)

  1. 连接未正确关闭
  2. 队列大小不够(如何确定最佳队列大小?)
  3. nodejs 或 mysql 版本有问题(可以使用什么版本来解决这个问题?)
  4. mysql 查询中的问题(与此问题相关的查询可能存在哪些问题?)
  5. 使用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);