UNPKG

nyx_server

Version:

Node内容发布

170 lines (153 loc) 4.81 kB
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(); }