您的位置:首页 > 数据库

阿里巴巴中间件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>  



<?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>


              然后就可以像使用一个数据库一张表一样进行开发了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: