2016-11-21 94 views
0

我有一個nodeJs應用程序,它接收每分鐘0-3000個請求(不規則,無模式)的請求。大約80%-90%的請求導致mysql插入或更新操作。什麼可能的原因會導致nodejs中的mysql隊列限制問題

節點版本 - 4.2.2
MySQL版本 - 14.14 DISTRIB 44年5月5日,使用readline的Debian的Linux-GNU(x86_64的)6.2
使用的框架的NodeJS是的RESTify

我得到的連接從一個大小爲20的mysql連接池。

我時間到了(零星)看到「mysql queue limit reached」的問題。什麼都不可能(從以下原因分開)導致此問題?

  1. 連接沒有正確關閉
  2. 隊列大小是不夠的(我怎樣才能確定最佳隊列的大小?)
  3. 問題用的NodeJS或MySQL版本(可使用什麼版本來解決這個?)在MySQL查詢
  4. 問題(可能在此問題相關的查詢是有什麼可能的問題?)
  5. 萬阿英,蔣達清與使用的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 
} 
+0

您使用哪種框架連接到節點中的mysql?有太多的連接應該給你另一個錯誤,所以可能不是問題。隊列大小似乎是連接到mysql的nodejs框架的結構,如果我沒有錯,那麼問題可能在這裏。我高度懷疑node或mysql是這個問題的原因。 –

+0

我正在使用mysql nodejs驅動程序來連接數據庫。它似乎是最穩定和最受歡迎的驅動程序 https://www.npmjs.com/package/mysql –

+0

是的,隊列大小是驅動程序的構造函數,通過nodejs代碼完成 –

回答

1

正是從性能的角度來看最好先用所謂的「連接池」。

連接池是維護數據庫連接緩存的機制,以便連接在釋放後可以重新使用。在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); 
+0

如何確定用於connectionLimit變量的值。僅供參考,max_connections系統變量設置爲151(我認爲這是默認值)。我甚至不知道max_connections系統變量的值應該是多少。你能解釋一下嗎? –

+0

很難說 - 這取決於你的服務器負載。根據我的經驗,通常連接的值在100到500之間對於低到中等的服務器負載就足夠了。 – bodi0

+1

@PubuduDodangoda這個限制是你必須持續不斷的。如果你有很多慢速查詢和高流量,你需要更多的連接可用。如果你只有快速查詢,你可以用更少的安全。現在,你爲什麼不只是允許一個gazillion連接?那麼,你希望它儘可能接近你的實際極限,所以如果有什麼錯誤的話,它可能會觸發。例如,如果連接未正確關閉,查詢完成的時間非常長,等等。這些情況下需要進一步調查,並且您不會輕易注意到有很高的限制。 –

相關問題