阿里巴巴中间件TDDL用于连接数据库,分表分库查询
2016-07-25 15:36
621 查看
1.创建数据源
由DBA来做。
一般数据源有3层:
(1)Matrix
分库分表,数据路由,对应一个应用,下面有若干个group
(2)Group
主备切换,读写分离,对应一组主备数据库,下面有若干atom
(3)Atom
对应一个数据库实例
2.创建分库分表规则
(1)编写规则文件
实际上就是spring配置文件的一部分
[html]
view plain
copy
print?
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--这个bean配置为TDDL规则总配置-->
<bean id="vtabroot" class="com.taobao.tddl.interact.rule.VirtualTableRoot" init-method="init">
<!--没有被配置在tableRules的逻辑表都将在这个group里,以单表形式执行-->
<property name="defaultDbIndex" value="TDDL_DEFAULT_GROUP" />
<!--数据库类型,默认是mysql -->
<property name="dbType" value="MYSQL"></property>
<!--该map配置有分表的逻辑表,有几个表有分表就配置几个键值对(该事例表示只有三个表需要分表)-->
<property name="tableRules">
<map>
<!-- key是逻辑表名,value指的是对应具体配置的id -->
<entry key="user" value-ref="user_bean"></entry>
<!--逻辑表名为admin,具体的分表规则在id="admin_bean"的配置中-->
<entry key="admin" value-ref="admin_bean"></entry>
<!--这张表是单表,可以配置在这,不配置的话默认走defaultDbIndex -->
<entry key="picture" value-ref="picture_bean"></entry>
</map>
</property>
</bean>
<!--按照user_id取模划分64张表,表明具体为'user_0000'-'user_0063',
'user_0000'-'user_0031'在'TDDL_0000_GROUP'中,
'user_0032'-'user_0063'在'TDDL_0001_GROUP'中-->
<bean id="user_bean" class="com.taobao.tddl.interact.rule.TableRule">
<!-- groupKey格式框架,{}中的数将会被dbRuleArray的值替代,并保持位数-->
<property name="dbNamePattern" value="TDDL_{0000}_GROUP" />
<!--具体的分库规则-->
<property name="dbRuleArray">
<!--按照user_id取模划分64张表,结果除以32后分到两个库中-->
<value>(#user_id,1,64#.longValue() % 64).intdiv(32)</value>
</property>
<!--具体表名格式框架,{}中的数将会被tbRuleArray的值替代,并保持位数-->
<property name="tbNamePattern" value="user_{0000}"></property>
<!--具体的分表规则-->
<property name="tbRuleArray">
<!--按照user_id取模划分64张表-->
<value>#user_id,1,64#.longValue() % 64</value>
</property>
<!--全表扫描开关,默认关闭,是否允许应用端在没有给定分表键值的情况下查询全表-->
<property name="allowFullTableScan" value="true" />
</bean>
<!--按照user_id取模划分4张表,表名具体为'admin_00'-'admin_03',
所有表都在'TDDL_DEFAULT_GROUP'中-->
<bean id="admin_bean" class="com.taobao.tddl.interact.rule.TableRule">
<!--分库规则,该表没有分库,所有表都在这个group上-->
<property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />
<property name="tbNamePattern" value="admin_{00}"></property>
<property name="tbRuleArray">
<value>#user_id,1,4#.longValue() % 4</value>
</property>
</bean>
<!--即不分库也不分表-->
<bean id="picture_bean" class="com.taobao.tddl.interact.rule.TableRule">
<property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />
<property name="tbNamePattern" value="picture"></property>
</bean>
</beans>
(2)使用规则
1)远端配置
在tddl 的ops中->TDDL配置管理->新增配置,然后将编写的规则文件内容复制进去,提交即可
2)本地配置
将规则文件放置在项目路径中即可
3.创建应用
(1)添加依赖
[html]
view plain
copy
print?
<dependency>
<groupId>com.taobao.tddl</groupId>
<artifactId>tddl-client</artifactId>
<type>jar</type>
</dependency>
[html]
view plain
copy
print?
<bean id="s2sTddlGroupDataSource" class="com.taobao.tddl.jdbc.group.TGroupDataSource" init-method="init">
<property name="appName" value="${alibaba.intl.s2s.tddl.appname}"></property>
<!--<property name="appRuleFile" value="tddl-rule.xml"></property>-->
<property name="dbGroupKey" value="${alibaba.intl.s2s.tddl.groupname}"></property>
<property name="dataSourceType" value="DruidDataSource"></property>
<property name="dynamicRule" value="true"></property>
<!--<property name="useLocalConfig" value="true"></property>-->
</bean>
appName指的是应用的名称,需要和在tddl ops上配置的appName一致
dynamicRule表示配置放在diamond上,useLocalConfig表示配置放置在本地,appRuleFile表示本地的规则文件的路径
(3)有了这个数据源之后,就可以将数据源配置到jdbc、ibatis等Template中了
[html]
view plain
copy
print?
<bean id="s2sSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="/biz/sqlmap-s2s.xml" />
<property name="dataSource" ref="s2sTddlGroupDataSource" />
</bean>
然后就可以像使用一个数据库一张表一样进行开发了
由DBA来做。
一般数据源有3层:
(1)Matrix
分库分表,数据路由,对应一个应用,下面有若干个group
(2)Group
主备切换,读写分离,对应一组主备数据库,下面有若干atom
(3)Atom
对应一个数据库实例
2.创建分库分表规则
(1)编写规则文件
实际上就是spring配置文件的一部分
[html]
view plain
copy
print?
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--这个bean配置为TDDL规则总配置-->
<bean id="vtabroot" class="com.taobao.tddl.interact.rule.VirtualTableRoot" init-method="init">
<!--没有被配置在tableRules的逻辑表都将在这个group里,以单表形式执行-->
<property name="defaultDbIndex" value="TDDL_DEFAULT_GROUP" />
<!--数据库类型,默认是mysql -->
<property name="dbType" value="MYSQL"></property>
<!--该map配置有分表的逻辑表,有几个表有分表就配置几个键值对(该事例表示只有三个表需要分表)-->
<property name="tableRules">
<map>
<!-- key是逻辑表名,value指的是对应具体配置的id -->
<entry key="user" value-ref="user_bean"></entry>
<!--逻辑表名为admin,具体的分表规则在id="admin_bean"的配置中-->
<entry key="admin" value-ref="admin_bean"></entry>
<!--这张表是单表,可以配置在这,不配置的话默认走defaultDbIndex -->
<entry key="picture" value-ref="picture_bean"></entry>
</map>
</property>
</bean>
<!--按照user_id取模划分64张表,表明具体为'user_0000'-'user_0063',
'user_0000'-'user_0031'在'TDDL_0000_GROUP'中,
'user_0032'-'user_0063'在'TDDL_0001_GROUP'中-->
<bean id="user_bean" class="com.taobao.tddl.interact.rule.TableRule">
<!-- groupKey格式框架,{}中的数将会被dbRuleArray的值替代,并保持位数-->
<property name="dbNamePattern" value="TDDL_{0000}_GROUP" />
<!--具体的分库规则-->
<property name="dbRuleArray">
<!--按照user_id取模划分64张表,结果除以32后分到两个库中-->
<value>(#user_id,1,64#.longValue() % 64).intdiv(32)</value>
</property>
<!--具体表名格式框架,{}中的数将会被tbRuleArray的值替代,并保持位数-->
<property name="tbNamePattern" value="user_{0000}"></property>
<!--具体的分表规则-->
<property name="tbRuleArray">
<!--按照user_id取模划分64张表-->
<value>#user_id,1,64#.longValue() % 64</value>
</property>
<!--全表扫描开关,默认关闭,是否允许应用端在没有给定分表键值的情况下查询全表-->
<property name="allowFullTableScan" value="true" />
</bean>
<!--按照user_id取模划分4张表,表名具体为'admin_00'-'admin_03',
所有表都在'TDDL_DEFAULT_GROUP'中-->
<bean id="admin_bean" class="com.taobao.tddl.interact.rule.TableRule">
<!--分库规则,该表没有分库,所有表都在这个group上-->
<property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />
<property name="tbNamePattern" value="admin_{00}"></property>
<property name="tbRuleArray">
<value>#user_id,1,4#.longValue() % 4</value>
</property>
</bean>
<!--即不分库也不分表-->
<bean id="picture_bean" class="com.taobao.tddl.interact.rule.TableRule">
<property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />
<property name="tbNamePattern" value="picture"></property>
</bean>
</beans>
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!--这个bean配置为TDDL规则总配置--> <bean id="vtabroot" class="com.taobao.tddl.interact.rule.VirtualTableRoot" init-method="init"> <!--没有被配置在tableRules的逻辑表都将在这个group里,以单表形式执行--> <property name="defaultDbIndex" value="TDDL_DEFAULT_GROUP" /> <!--数据库类型,默认是mysql --> <property name="dbType" value="MYSQL"></property> <!--该map配置有分表的逻辑表,有几个表有分表就配置几个键值对(该事例表示只有三个表需要分表)--> <property name="tableRules"> <map> <!-- key是逻辑表名,value指的是对应具体配置的id --> <entry key="user" value-ref="user_bean"></entry> <!--逻辑表名为admin,具体的分表规则在id="admin_bean"的配置中--> <entry key="admin" value-ref="admin_bean"></entry> <!--这张表是单表,可以配置在这,不配置的话默认走defaultDbIndex --> <entry key="picture" value-ref="picture_bean"></entry> </map> </property> </bean> <!--按照user_id取模划分64张表,表明具体为'user_0000'-'user_0063', 'user_0000'-'user_0031'在'TDDL_0000_GROUP'中, 'user_0032'-'user_0063'在'TDDL_0001_GROUP'中--> <bean id="user_bean" class="com.taobao.tddl.interact.rule.TableRule"> <!-- groupKey格式框架,{}中的数将会被dbRuleArray的值替代,并保持位数--> <property name="dbNamePattern" value="TDDL_{0000}_GROUP" /> <!--具体的分库规则--> <property name="dbRuleArray"> <!--按照user_id取模划分64张表,结果除以32后分到两个库中--> <value>(#user_id,1,64#.longValue() % 64).intdiv(32)</value> </property> <!--具体表名格式框架,{}中的数将会被tbRuleArray的值替代,并保持位数--> <property name="tbNamePattern" value="user_{0000}"></property> <!--具体的分表规则--> <property name="tbRuleArray"> <!--按照user_id取模划分64张表--> <value>#user_id,1,64#.longValue() % 64</value> </property> <!--全表扫描开关,默认关闭,是否允许应用端在没有给定分表键值的情况下查询全表--> <property name="allowFullTableScan" value="true" /> </bean> <!--按照user_id取模划分4张表,表名具体为'admin_00'-'admin_03', 所有表都在'TDDL_DEFAULT_GROUP'中--> <bean id="admin_bean" class="com.taobao.tddl.interact.rule.TableRule"> <!--分库规则,该表没有分库,所有表都在这个group上--> <property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" /> <property name="tbNamePattern" value="admin_{00}"></property> <property name="tbRuleArray"> <value>#user_id,1,4#.longValue() % 4</value> </property> </bean> <!--即不分库也不分表--> <bean id="picture_bean" class="com.taobao.tddl.interact.rule.TableRule"> <property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" /> <property name="tbNamePattern" value="picture"></property> </bean> </beans>
(2)使用规则
1)远端配置
在tddl 的ops中->TDDL配置管理->新增配置,然后将编写的规则文件内容复制进去,提交即可
2)本地配置
将规则文件放置在项目路径中即可
3.创建应用
(1)添加依赖
[html]
view plain
copy
print?
<dependency>
<groupId>com.taobao.tddl</groupId>
<artifactId>tddl-client</artifactId>
<type>jar</type>
</dependency>
<dependency> <groupId>com.taobao.tddl</groupId> <artifactId>tddl-client</artifactId> <type>jar</type> </dependency>(2)在spring配置文件中配置tddl
[html]
view plain
copy
print?
<bean id="s2sTddlGroupDataSource" class="com.taobao.tddl.jdbc.group.TGroupDataSource" init-method="init">
<property name="appName" value="${alibaba.intl.s2s.tddl.appname}"></property>
<!--<property name="appRuleFile" value="tddl-rule.xml"></property>-->
<property name="dbGroupKey" value="${alibaba.intl.s2s.tddl.groupname}"></property>
<property name="dataSourceType" value="DruidDataSource"></property>
<property name="dynamicRule" value="true"></property>
<!--<property name="useLocalConfig" value="true"></property>-->
</bean>
<bean id="s2sTddlGroupDataSource" class="com.taobao.tddl.jdbc.group.TGroupDataSource" init-method="init"> <property name="appName" value="${alibaba.intl.s2s.tddl.appname}"></property> <!--<property name="appRuleFile" value="tddl-rule.xml"></property>--> <property name="dbGroupKey" value="${alibaba.intl.s2s.tddl.groupname}"></property> <property name="dataSourceType" value="DruidDataSource"></property> <property name="dynamicRule" value="true"></property> <!--<property name="useLocalConfig" value="true"></property>--> </bean>
appName指的是应用的名称,需要和在tddl ops上配置的appName一致
dynamicRule表示配置放在diamond上,useLocalConfig表示配置放置在本地,appRuleFile表示本地的规则文件的路径
(3)有了这个数据源之后,就可以将数据源配置到jdbc、ibatis等Template中了
[html]
view plain
copy
print?
<bean id="s2sSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="/biz/sqlmap-s2s.xml" />
<property name="dataSource" ref="s2sTddlGroupDataSource" />
</bean>
<bean id="s2sSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="/biz/sqlmap-s2s.xml" /> <property name="dataSource" ref="s2sTddlGroupDataSource" /> </bean>
然后就可以像使用一个数据库一张表一样进行开发了
相关文章推荐
- win10 安装sqlserver 2008R2 出现问题:性能计数器注册表配置单元一致性
- 用户列表-投资记录sql
- 电Call记录统计查询sql
- MYSQL C API 入门教程
- Union all的用法实例sql
- sql优化建议
- sql优化建议
- 工作——自动化测试中用到的SQL server查询语句的格式调整
- 使用SQLite本地数据库实现注册登陆功能
- sql server 2000收缩数据库【极简操作】
- session入Redis
- SQL索引一步到位
- sql基本操作总结
- mysql常用的命令操作
- mysql之select from where
- sql执行顺序
- ORACLE数据库文件丢失后的恢复测试
- sql server 卸载后重新安装清除注册表
- 工作——SSIS数据抽取中使用到的SQL server语句
- MySQL的读写分离(一)