Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么可能的原因会导致nodejs中的mysql队列限制到达问题_Mysql_Node.js_Express_Queue_Restify - Fatal编程技术网

什么可能的原因会导致nodejs中的mysql队列限制到达问题

什么可能的原因会导致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队列限制已达到”的问题。什么可能导致此问题?(除以下原因外) 连接未正确关闭 队列大小不足(如

我有一个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队列限制已达到”的问题。什么可能导致此问题?(除以下原因外)

  • 连接未正确关闭
  • 队列大小不足(如何确定最佳队列大小?)
  • nodejs或mysql版本存在问题(可以使用哪些版本来解决此问题?)
  • mysql查询中的问题(与此问题相关的查询中可能存在哪些问题?)
  • 使用nodejs框架的问题(使用expressJs会解决这个问题吗?)
  • Edit1 下面是我如何查询数据库的一个框架

    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您必须不断考虑这个限制。如果你有很多慢查询和高流量,你需要更多的可用连接。如果你只有快速的查询,你可以用更少的查询来保证安全。现在,你为什么不允许无数的连接呢?好吧,你希望它尽可能接近你的实际极限,这样如果出了什么问题,它就会触发。例如,如果连接没有正确关闭,查询需要花费非常长的时间才能完成,等等。这些情况下,您需要进一步调查,并且您不会轻易注意到有很高的限制。