UNPKG

tribedb

Version:

Unlimited expansion MySQL cluster storage system

137 lines (97 loc) 2.9 kB
/** * * 数据库连接池 * */ 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]; }