2017-08-25 172 views
0

我目前正在使用ApacheBench測試我的節點應用程序。我遇到了一個與我的數據庫相關的問題ER_CON_COUNT_ERROR: Too many connectionsNodeJs - 如何共享我的模型的MySQL池,以避免'ER_CON_COUNT_ERROR'

我使用MySQL的節點模塊的頂部,你可以看到略低於

var mysql = require('mysql'); 
var config = require('path/to/config'); 
var message = require('./myMessageLib.js'); 

var pool = mysql.createPool({ 
    connectionLimit : 100, 
    host: config.db.mysql.host, 
    user: config.db.mysql.user, 
    password: config.db.mysql.password, 
    database: config.db.mysql.database 
}); 

var query = function(query_str, values, next) { 
    pool.getConnection((err, connection) => { 
     if (err) { 
      console.error("MySQL Fail to get a connection in pool : " + err); 
      if (typeof connection !== "undefined") 
       connection.release(); 
      next(error, null); 
      return ; 
     } 
     connection.query(query_str, values, function(error, data, fields) { 
      connection.release(); 
      if (error) 
       if (config.app.env.dev) 
        throw (error); 
       else { 
        next(error, null); 
        return (message.error("MySQL query failed : " + query_str + "/err : " + error)); 
       } 
      if (data.length == 0) 
       next(null); 
      else 
       next(data); 
     }) 
    }) 
} 

exports.query = query; 

我做這樣的事情

var mysql = require('path/to/mysqllib'); 

/** 
* Class PlayerModel 
*/ 
function PlayerModel() { }; 

PlayerModel.prototype.get = function(id, next) { 
    mysql.query("SELECT ....", [id], function(player) { 
     // stuff 
    }) 
} 

module.exports = PlayerModel; 

使用這個庫在我的模型很短的庫這些東西在我的主頁上,我使用了上面介紹的不同模型,每個模型都會啓動一個查詢來獲取一些數據庫信息。當我啓動一個只有50個併發級別的ApacheBench時,我得到了ER_CON_COUNT_ERROR:連接太多。所以我有這樣的感覺,因爲它看起來並不尊重寫在短MySQL庫中的連接數限制100,所以這個池沒有做好。

我正在考慮在global nodejs變量中創建和存儲池,以便能夠正確地分享它,但我不確定這是一種好方法,也許我在池中做錯了什麼implentation。

您對建議有任何想法或改進嗎?

謝謝配偶!

回答

0

我想出了這個問題。

我的應用程序正在以羣集模式進行部署。兩個進程同時運行。因此,可能創建了兩個包含100個連接的池,這導致總共200個連接高於MySQL默認連接限制。

+0

如果您仍然需要集羣,您可以簡單地在'if(cluster.isMaster){...}'塊內創建連接池。查看[cluster.isMaster](https://nodejs.org/api/cluster.html#cluster_cluster_ismaster)獲取模式信息。 – mscheker

0

偉大的發現一個解決方案,這裏是另一個代碼少。

創建一個js文件,dbconnection.js例如

var mysql = require("mysql"); 

var pool = mysql.createPool({ 
    connectionLimit: 10, 
    host: '...', 
    user: '...', 
    password: '...', 
    database: '...', 
    dateStrings: true 
}); 

exports.connection = { 
    query: function() { 
     var queryArgs = Array.prototype.slice.call(arguments), 
      events = [], 
      eventNameIndex = {}; 

     pool.getConnection(function (err, conn) { 
      if (err) { 
       if (eventNameIndex.error) { 
        eventNameIndex.error(); 
       } 
      } 
      if (conn) { 
       var q = conn.query.apply(conn, queryArgs); 
       q.on('end', function() { 
        conn.release(); 
       }); 

       events.forEach(function (args) { 
        q.on.apply(q, args); 
       }); 
      } 
     }); 

     return { 
      on: function (eventName, callback) { 
       events.push(Array.prototype.slice.call(arguments)); 
       eventNameIndex[eventName] = callback; 
       return this; 
      } 
     }; 
    } 
}; 

在其他文件中要使用的連接

var db = require('./dbconnection.js'); 

,而不是和

connection.query 

使用

db.connection.query