阿里巴巴中介軟體TDDL用於連線資料庫,分表分庫查詢
阿新 • • 發佈:2019-01-29
1.建立資料來源
由DBA來做。
一般資料來源有3層:
(1)Matrix
分庫分表,資料路由,對應一個應用,下面有若干個group
(2)Group
主備切換,讀寫分離,對應一組主備資料庫,下面有若干atom
(3)Atom
對應一個數據庫例項
2.建立分庫分表規則
(1)編寫規則檔案
實際上就是spring配置檔案的一部分
- <?xmlversion="1.0"encoding="gb2312"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
- "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <!--這個bean配置為TDDL規則總配置-->
- <beanid="vtabroot"class="com.taobao.tddl.interact.rule.VirtualTableRoot"
- <!--沒有被配置在tableRules的邏輯表都將在這個group裡,以單表形式執行-->
- <propertyname="defaultDbIndex"value="TDDL_DEFAULT_GROUP"/>
- <!--資料庫型別,預設是mysql -->
- <propertyname="dbType"value="MYSQL"></property>
- <!--該map配置有分表的邏輯表,有幾個表有分表就配置幾個鍵值對(該事例表示只有三個表需要分表)-->
- <propertyname="tableRules">
- <map>
- <!-- key是邏輯表名,value指的是對應具體配置的id -->
- <entrykey="user"value-ref="user_bean"></entry>
- <!--邏輯表名為admin,具體的分表規則在id="admin_bean"的配置中-->
- <entrykey="admin"value-ref="admin_bean"></entry>
- <!--這張表是單表,可以配置在這,不配置的話預設走defaultDbIndex -->
- <entrykey="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'中-->
- <beanid="user_bean"class="com.taobao.tddl.interact.rule.TableRule">
- <!-- groupKey格式框架,{}中的數將會被dbRuleArray的值替代,並保持位數-->
- <propertyname="dbNamePattern"value="TDDL_{0000}_GROUP"/>
- <!--具體的分庫規則-->
- <propertyname="dbRuleArray">
- <!--按照user_id取模劃分64張表,結果除以32後分到兩個庫中-->
- <value>(#user_id,1,64#.longValue() % 64).intdiv(32)</value>
- </property>
- <!--具體表名格式框架,{}中的數將會被tbRuleArray的值替代,並保持位數-->
- <propertyname="tbNamePattern"value="user_{0000}"></property>
- <!--具體的分表規則-->
- <propertyname="tbRuleArray">
- <!--按照user_id取模劃分64張表-->
- <value>#user_id,1,64#.longValue() % 64</value>
- </property>
- <!--全表掃描開關,預設關閉,是否允許應用端在沒有給定分表鍵值的情況下查詢全表-->
- <propertyname="allowFullTableScan"value="true"/>
- </bean>
- <!--按照user_id取模劃分4張表,表名具體為'admin_00'-'admin_03',
- 所有表都在'TDDL_DEFAULT_GROUP'中-->
- <beanid="admin_bean"class="com.taobao.tddl.interact.rule.TableRule">
- <!--分庫規則,該表沒有分庫,所有表都在這個group上-->
- <propertyname="dbNamePattern"value="TDDL_DEFAULT_GROUP"/>
- <propertyname="tbNamePattern"value="admin_{00}"></property>
- <propertyname="tbRuleArray">
- <value>#user_id,1,4#.longValue() % 4</value>
- </property>
- </bean>
- <!--即不分庫也不分表-->
- <beanid="picture_bean"class="com.taobao.tddl.interact.rule.TableRule">
- <propertyname="dbNamePattern"value="TDDL_DEFAULT_GROUP"/>
- <propertyname="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?
- <beanid="s2sTddlGroupDataSource"class="com.taobao.tddl.jdbc.group.TGroupDataSource"init-method="init">
- <propertyname="appName"value="${alibaba.intl.s2s.tddl.appname}"></property>
- <!--<property name="appRuleFile" value="tddl-rule.xml"></property>-->
- <propertyname="dbGroupKey"value="${alibaba.intl.s2s.tddl.groupname}"></property>
- <propertyname="dataSourceType"value="DruidDataSource"></property>
- <propertyname="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表示本地的規則檔案的路徑
[html] view plain copy print?
- <beanid="s2sSqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
- <propertyname="configLocation"value="/biz/sqlmap-s2s.xml"/>
- <propertyname="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>
然後就可以像使用一個數據庫一張表一樣進行開發了