我目前正在使用ApacheBench測試我的節點應用程序。我遇到了一個與我的數據庫相關的問題ER_CON_COUNT_ERROR: Too many connections
。NodeJs - 如何共享我的模型的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。
您對建議有任何想法或改進嗎?
謝謝配偶!
如果您仍然需要集羣,您可以簡單地在'if(cluster.isMaster){...}'塊內創建連接池。查看[cluster.isMaster](https://nodejs.org/api/cluster.html#cluster_cluster_ismaster)獲取模式信息。 – mscheker