TDDL动态数据源源代码学习笔记

TDDL动态数据源主要类:
[img]http://dl2.iteye.com/upload/attachment/0085/4949/5557c115-a9c8-3f24-b75f-8f3d064c95c7.png[/img]
动态数据源重新实现了jdbc的api,比如TGroupConnection、TGroupStatement、TGroupPreparedStatement、TGroupCallableStatement等,但这些类仅是对oracle、mysql对应的jdbc的装饰,另外以TGroupConnection为例,在创建TGroupConnection时并不会真正意义与数据库建立物理连接。

一. 数据源信息获取:

1. 数据源信息从diamond 获取
TGroupDataSource init的时候基于appName+groupKey两个参数通过httpClient访问diamond(Diamond是一个持久配置管理中心),获取到Group对应的数据源配置信息(多个数据源格式如:db0:rwp1q1i0,db1:rwp0q0i1),然后根据ds的key(比如db0),再到diamond系统中获取db的具体配置信息,比如 ip,port,database,user,pwd等
2.hardcode具体的数据源,比如
DataSource ds1 = DataSourceFactory.getMySQLDataSource(1);
DataSource ds2 = DataSourceFactory.getMySQLDataSource(2);
DataSource ds3 = DataSourceFactory.getMySQLDataSource(3);
//读库时最有可能从db3读,然后是db2,db1的权重最小
TGroupDataSource ds = new TGroupDataSource();
DataSourceWrapper dsw1 = new DataSourceWrapper("db1", "r10w", ds1, DBType.MYSQL);
DataSourceWrapper dsw2 = new DataSourceWrapper("db2", "r20", ds2, DBType.MYSQL);
DataSourceWrapper dsw3 = new DataSourceWrapper("db3", "r30", ds3, DBType.MYSQL);
ds.init(dsw1, dsw2, dsw3);

二. TDDL数据源路由
TDDL数据源使用 jboss dataSource 为基础
1.通过hints方式,指定使用具体哪一个dataSource index
比如:/*+TDDL_GROUP({groupIndex:12})*/select * from tab"
2.运行时通过GroupDataSourceRouteHelper.executeByGroupDataSourceIndex方法指定哪个数据源index
3.DBSelector,且分读写两种类型,在执行TGroupStatement具体的exute方法,如果是select 则从读类型DBSelector获取数据源,否则从写类型的DBSelector中获取

有以下几种实现:
1)EquityDbManager 淘宝称之为对等数据库资源管理器,所有优先级相同的数据源放到一起。
2)PriorityDbGroupSelector 支持优先级的数据资源,数据源的优先级不同,因为可能存在优先级相同的数据源,所以内置通过EquityDbManager集合实现。
3)OneDBSelector 一个仅且仅有一个数据源
4) RuntimeWritableAtomDBSelector 用于运行期间主备切换的场景(这个还没完全理解跟 EquityDbManager,PriorityDbGroupSelector等在功能上有啥区别?? )
5)其他方式
在diamond服务器上group datasource 配置扩展信息,指定具体sql或表名使用的数据源index,其格式为json:
{sqlDsIndex: { 0:[sql1,sql2,sql3], 1:[sql0], 2:[sql4]
* }, tabDsIndex: { 0:[table1,table2] 1:[table3,table4] },
* defaultMain:true}
自动会对当前执行的sql执行去空白字符、回车、tab等字符,支持子表比如 t_parent,t_parent_001。
该路由方式适用于,将一个表拆分成N份保存到一个db里,指定具体的dataSourceIndex

注:关于非OneDBSelector,数据源通过数据源的权重以及优先级来定义,格式如: [r|R](\\d*) [w|W](\\d*) [p|P](\\d*) [q|Q](\\d*) [i|I](\\d*) 格式指定数据源对应的属性 r/w表示 读/写,r/w后面的数字表示权重 p/q表示后面的数字表示读/写优先级,权重越大表示在相同的优先级别下的数据源被选中概率越大,对于优先级别越大,则优先选中。

你可能感兴趣的:(TDDL动态数据源源代码学习笔记)