nyx_server
Version:
Node内容发布
170 lines (153 loc) • 4.81 kB
JavaScript
var Crypto = require('crypto');
var Promise = require("bluebird");
var fs = require("fs");
var path = require("path");
var _ = require("lodash");
var ConnectionPools = function(alloctInterval , checkBusyInterval , checkRequestConnectTimeout){
this.pools ={};
this.connectParamsKeys = {};
this.configNames = {};
this.alloctInterval = alloctInterval || 100; //连接分配周期
this.checkBusyInterval = checkBusyInterval || 1*60*1000; //被占用连接检测
this.checkRequestConnectTimeout = checkRequestConnectTimeout || 1*60*1000; //连接请求超时
};
/**
* 得到连接
* @param configName 连接配置项,configName用来区分不同的数据源 projectname.engineName.configName
*/
ConnectionPools.prototype.getConnect = function(configName){
//返回对Connection的代理实例
var nameSplit = configName.split(".");
var engineName = nameSplit[1];
var connectParams = this.getConnectionParams(configName);
if(!connectParams){
return Promise.reject(new Error("没有"+configName+"相关的配置"));
}
var serialize = this.serialize(engineName , connectParams);
var connectPool = this.pools[serialize];
if(!connectPool){
var ConnectPool = require("./connectionPool-"+engineName);
connectPool = new ConnectPool(connectParams);
this.pools[serialize] = connectPool;
}
return connectPool.getConnection();
};
/**
* 将配置参数序列化为字符串,作为key使用
* @param {engineName} 数据库引擎名称
* @param {Object}connectParams 连接参数对象
* @return {String} 返回序列化后的连接参数
*/
ConnectionPools.prototype.serialize = function(engineName , connectParams){
//return JSON.stringify(connectParams)
var keys = Object.keys(connectParams);
keys.sort(); //将key排序
var str = "";
keys.forEach(function(key , index){
if(index!=0){
str += '_';
}
str += (key+'_'+connectParams[key]);
});
// var hash = Crypto.createHash("MD5");
// hash.update(str);
// hash = hash.digest("hex");
// return hash.slice(0, 8);
return str;
};
/**
* 增加一个新的配置
* @param {String}configName 配置名称
* @param {Object}connectParams
*/
ConnectionPools.prototype.addConnectParams = function(configName , connectParams){
this.configNames[configName] = connectParams;
};
/**
* 得到连接参数
* @params 配置名称
*/
ConnectionPools.prototype.getConnectionParams = function(configName){
return this.configNames[configName];
};
ConnectionPools.prototype.start = function(){
var allocConnect = function(){
var self = this;
Object.keys(this.pools).forEach(function(poolkey){
self.pools[poolkey].allocConnect();
});
setTimeout(allocConnect.bind(this) , self.alloctInterval);
};
allocConnect.apply(this);
var checkBusy = function(){
var self = this;
Object.keys(this.pools).forEach(function(poolkey){
self.pools[poolkey].checkBusy();
});
setTimeout(checkBusy.bind(this) , self.checkBusyInterval);
};
checkBusy.apply(this);
var checkRequestTimeout = function(){
var self = this;
Object.keys(this.pools).forEach(function(poolkey){
self.pools[poolkey].checkBusy();
});
setTimeout(checkBusy.bind(this) , self.checkBusyInterval);
};
};
ConnectionPools.prototype.stop = function(){
var self = this;
Object.keys(this.pools).forEach(function(poolkey){
self.pools[poolkey].clean();
});
};
/**
* 初始换项目的数据库配置
* @param {Project}project 项目对象
*/
ConnectionPools.prototype.initProject = function(project){
var self = this;
var projectName = project.name;
var basePath = project.basePath;
var dbconfigPath = path.join(basePath , "db.json");
if(fs.existsSync(dbconfigPath)) {
var dbconf = require(dbconfigPath);
Object.keys(dbconf).forEach(function(engineName){
var configNames = dbconf[engineName]; //配置名
configNames.forEach(function(configName){
Object.keys(configName).forEach(function(name){
var fullName = projectName+"."+engineName+"."+name;
self.addConnectParams(fullName , configName[name]);
});
});
});
}
};
/**
* 得到当前连接池状态
*/
ConnectionPools.prototype.getState = function(){
var ret = {};
_.forIn(this.pools , function(pool , key){
var poolSerialize = pool.getState();
ret[key] = poolSerialize;
});
return ret;
};
module.exports = ConnectionPools;
if(!module.parent){
var cps = new ConnectionPools(500);
cps.start();
cps.addConnectParams("projectName.mysql.test1" , { host: '172.30.84.166', user: 'fe', password: 'fe_gyg0sd', database: 'nxy' });
var pconn = cps.getConnect("projectName.mysql.test1");
pconn.then(function(conn){
console.log(conn.query.toString());
console.log(conn.release.toString());
}).catch(function(err){
console.log(err);
});
var wait= function(){
setTimeout(wait, 3000);
};
wait();
}