tribedb
Version:
Unlimited expansion MySQL cluster storage system
137 lines (97 loc) • 2.9 kB
JavaScript
/**
*
* 数据库连接池
*
*/
const util = require('util');
const mysql = require('mysql');
const config = require('./config.js');
// 数据库连接池集群
var poolMuster = []; // 全部
var poolMusterTable = {};
var poolMusterDbname = {};
// var poolCluster = mysql.createPoolCluster();
/**
* 销毁所有连接
*/
exports.destroy = function()
{
for (let i in poolMuster) {
poolMuster[i].end();
}
}
/**
* 通过数据表 获取连接
*/
exports.conn = function(table, opt, callback)
{
if( util.isFunction(opt) ){
callback = opt;
opt = {};
}
// 初始化连接池集群
createPoolCluster(table, opt);
// 挑选适合的集群
var pool = choosePool(table, opt);
// 返回连接
pool.getConnection(callback);
}
/**
* 挑选一个连接池(轮转调度)
*/
function choosePool(table, opt)
{
let plty = 'general';
opt.read && (plty='read');
opt.write && (plty='write');
// 轮转
let pool = poolMusterTable[table][plty].shift();
poolMusterTable[table][plty].push(pool);
if( ! pool)
throw new Error('TribeDB not find available configuration !');
return pool;
}
/**
* 创建数据库集群的连接池
*/
function createPoolCluster(table, opt)
{
if( poolMusterTable[table] )
return poolMusterTable[table];
let dbname = config.tableRouter[table];
dbname || (dbname = config.mainDatabaseName());
if( ! poolMusterDbname[dbname] ){
let poolobj = {
general : [],
write : [],
read : [],
};
// 循环每一个库配置
// log(dbname);
if( !config.databases[dbname]){
throw new Error('TribeDB not find database !');
}
config.databases[dbname].forEach(dbconf=>{
// log(dbconf);
let pool = mysql.createPool(dbconf);
let pools = [pool];
poolMuster.push( pool );
// die( pool );
if(dbconf.weight > 1) for (let i=1; i<dbconf.weight; i++) {
pools.push( pool ); // 复制代表权重
};
if( dbconf.readonly ){
poolobj.read = poolobj.read.concat( pools );
}else if( dbconf.writeonly ){
poolobj.write = poolobj.write.concat( pools );
}else{
poolobj.general = poolobj.general.concat( pools );
poolobj.write = poolobj.write.concat( pools );
poolobj.read = poolobj.read.concat( pools );
}
});
poolMusterDbname[dbname] = poolobj;
}
// log( poolMusterDbname[dbname] );
return poolMusterTable[table] = poolMusterDbname[dbname];
}