阿里巴巴中间件TDDL用于连接数据库,分表分库查询

1.创建数据源

          由DBA来做。

           一般数据源有3层:

          (1)Matrix

                     分库分表,数据路由,对应一个应用,下面有若干个group

          (2)Group

                     主备切换,读写分离,对应一组主备数据库,下面有若干atom

          (3)Atom

                     对应一个数据库实例


2.创建分库分表规则

              (1)编写规则文件

                        实际上就是spring配置文件的一部分

  1. <?xml version="1.0" encoding="gb2312"?>  
  2.   
  3. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
  4.   
  5. "http://www.springframework.org/dtd/spring-beans.dtd">  
  6.   
  7. <beans>  
  8.   
  9.    <!--这个bean配置为TDDL规则总配置-->  
  10.   
  11.     <bean id="vtabroot" class="com.taobao.tddl.interact.rule.VirtualTableRoot" init-method="init">  
  12.   
  13.        <!--没有被配置在tableRules的逻辑表都将在这个group里,以单表形式执行-->  
  14.   
  15.         <property name="defaultDbIndex" value="TDDL_DEFAULT_GROUP" />  
  16.   
  17.        <!--数据库类型,默认是mysql -->  
  18.   
  19.         <property name="dbType" value="MYSQL"></property>  
  20.   
  21.        <!--该map配置有分表的逻辑表,有几个表有分表就配置几个键值对(该事例表示只有三个表需要分表)-->  
  22.   
  23.         <property name="tableRules">  
  24.   
  25.             <map>  
  26.   
  27.                <!-- key是逻辑表名,value指的是对应具体配置的id -->  
  28.   
  29.                 <entry key="user" value-ref="user_bean"></entry>  
  30.   
  31.                <!--逻辑表名为admin,具体的分表规则在id="admin_bean"的配置中-->  
  32.   
  33.                 <entry key="admin" value-ref="admin_bean"></entry>  
  34.   
  35.                <!--这张表是单表,可以配置在这,不配置的话默认走defaultDbIndex -->  
  36.   
  37.                 <entry key="picture" value-ref="picture_bean"></entry>  
  38.   
  39.             </map>  
  40.   
  41.         </property>  
  42.   
  43.     </bean>  
  44.   
  45.    <!--按照user_id取模划分64张表,表明具体为'user_0000'-'user_0063',  
  46.   
  47.           'user_0000'-'user_0031'在'TDDL_0000_GROUP'中,  
  48.   
  49.           'user_0032'-'user_0063'在'TDDL_0001_GROUP'中-->  
  50.   
  51.     <bean id="user_bean" class="com.taobao.tddl.interact.rule.TableRule">  
  52.   
  53.        <!-- groupKey格式框架,{}中的数将会被dbRuleArray的值替代,并保持位数-->  
  54.   
  55.         <property name="dbNamePattern" value="TDDL_{0000}_GROUP" />  
  56.   
  57.        <!--具体的分库规则-->  
  58.   
  59.        <property name="dbRuleArray">  
  60.   
  61.            <!--按照user_id取模划分64张表,结果除以32后分到两个库中-->  
  62.   
  63.             <value>(#user_id,1,64#.longValue() % 64).intdiv(32)</value>  
  64.   
  65.         </property>  
  66.   
  67.        <!--具体表名格式框架,{}中的数将会被tbRuleArray的值替代,并保持位数-->  
  68.   
  69.         <property name="tbNamePattern" value="user_{0000}"></property>  
  70.   
  71.        <!--具体的分表规则-->  
  72.   
  73.         <property name="tbRuleArray">  
  74.   
  75.            <!--按照user_id取模划分64张表-->  
  76.   
  77.             <value>#user_id,1,64#.longValue() % 64</value>  
  78.   
  79.         </property>  
  80.   
  81.        <!--全表扫描开关,默认关闭,是否允许应用端在没有给定分表键值的情况下查询全表-->  
  82.   
  83.         <property name="allowFullTableScan" value="true" />  
  84.   
  85.     </bean>  
  86.   
  87.    <!--按照user_id取模划分4张表,表名具体为'admin_00'-'admin_03',  
  88.   
  89.          所有表都在'TDDL_DEFAULT_GROUP'中-->  
  90.   
  91.     <bean id="admin_bean" class="com.taobao.tddl.interact.rule.TableRule">  
  92.   
  93.        <!--分库规则,该表没有分库,所有表都在这个group上-->  
  94.   
  95.         <property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />  
  96.   
  97.         <property name="tbNamePattern" value="admin_{00}"></property>  
  98.   
  99.         <property name="tbRuleArray">  
  100.   
  101.             <value>#user_id,1,4#.longValue() % 4</value>  
  102.   
  103.         </property>  
  104.   
  105.     </bean>  
  106.   
  107.    <!--即不分库也不分表-->  
  108.   
  109.     <bean id="picture_bean" class="com.taobao.tddl.interact.rule.TableRule">  
  110.   
  111.         <property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />  
  112.   
  113.         <property name="tbNamePattern" value="picture"></property>  
  114.   
  115.     </bean>  
  116. </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)添加依赖

  1. <dependency>  
  2.     <groupId>com.taobao.tddl</groupId>  
  3.     <artifactId>tddl-client</artifactId>  
  4.     <type>jar</type>  
  5. </dependency>  
		<dependency>
			<groupId>com.taobao.tddl</groupId>
			<artifactId>tddl-client</artifactId>
			<type>jar</type>
		</dependency>
              (2)在spring配置文件中配置tddl

  1. <bean id="s2sTddlGroupDataSource" class="com.taobao.tddl.jdbc.group.TGroupDataSource" init-method="init">  
  2.      <property name="appName" value="${alibaba.intl.s2s.tddl.appname}"></property>  
  3.      <!--<property name="appRuleFile" value="tddl-rule.xml"></property>-->  
  4.   
  5.      <property name="dbGroupKey" value="${alibaba.intl.s2s.tddl.groupname}"></property>  
  6.      <property name="dataSourceType" value="DruidDataSource"></property>  
  7.      <property name="dynamicRule" value="true"></property>  
  8.      <!--<property name="useLocalConfig" value="true"></property>-->  
  9. </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中了

  1. <bean id="s2sSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
  2.     <property name="configLocation" value="/biz/sqlmap-s2s.xml" />  
  3.     <property name="dataSource" ref="s2sTddlGroupDataSource" />  
  4. </bean>  
    <bean id="s2sSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation" value="/biz/sqlmap-s2s.xml" />
        <property name="dataSource" ref="s2sTddlGroupDataSource" />
    </bean>

              然后就可以像使用一个数据库一张表一样进行开发了

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在分表分库后,不同节点数据库的连接可以通过连接池来管理。连接池是一种维护数据库连接的技术,它可以在应用程序启动时创建一定数量的数据库连接,并将这些连接放入连接池中。当应用程序需要访问数据库时,可以从连接池中获取一个可用的连接,使用完毕后再将连接放回连接池中。这样可以避免频繁地创建和销毁数据库连接,提高数据库访问效率。 ### 回答2: 在进行分表分库后,不同节点数据库的连接管理如下: 1. 连接池管理:为了提高系统性能和资源利用率,可以使用连接池来管理不同节点数据库的连接。连接池会提前创建一定数量的数据库连接,并在需要时从连接池中获取可用连接来处理请求。连接使用完毕后会被释放回连接池,供其他请求使用。 2. 读写分离:将读和写操作分别分配给不同的节点数据库。其中一个数据库节点负责处理写操作,同时将写操作的结果同步给其他读节点。这样能够有效降低写操作对整个系统的影响,并提高读操作的并发性能。 3. 负载均衡器:使用负载均衡器来分发不同请求到不同的数据库节点。负载均衡器可以根据节点的负载情况、可用性和网络延迟等因素来决定将请求分发到哪个节点。这样可以避免出现某些节点负载过高而导致系统性能下降或宕机的情况。 4. 数据同步机制:确保不同节点数据库之间的数据保持一致性。可以使用数据同步工具或者数据库复制功能来实现节点之间的数据同步。通常会设置定时任务或者实时监听来实现数据的增量或实时同步,保证各个节点的数据保持一致。 5. 故障恢复和监控:建立监控系统来实时监测各个数据库节点的运行状态。一旦某个节点发生故障,监控系统可以实时检测并进行故障恢复操作,比如自动切换到备用节点,避免服务中断。此外,还可以设置告警机制,及时通知相关人员以便进行故障处理。 总之,对于不同节点数据库的连接管理,需要充分考虑资源利用和系统性能的平衡、数据一致性以及故障恢复等方面的需求,采取相应的连接池、负载均衡、数据同步和监控机制来进行管理和调度。 ### 回答3: 在做分表分库后,不同节点数据库的连接可以通过以下几种方式来管理: 1.连接池管理:可以使用连接池来管理不同节点数据库的连接。连接池可以在应用启动时预先创建一定数量的数据库连接,并将其放入连接池中。应用程序需要连接数据库时,可以从连接池中获取一个空闲的连接并使用,使用完毕后再将连接归还到连接池中。连接池可以根据连接的使用情况动态调整连接的数量,以保证连接的有效利用和高效管理。 2.负载均衡:可以通过负载均衡技术将应用程序的请求分发到不同的节点数据库上。负载均衡可以根据不同的策略,如轮询、权重、哈希等算法,将请求均匀地分发到各个节点数据库上,实现请求的分流和负载的平衡。通过负载均衡的管理,可以提高系统的并发性能和可用性。 3.故障转移和容错处理:在分表分库的架构中,数据库节点可能会出现故障或失效的情况,为了保证系统的可用性,可以采用故障转移和容错处理的机制。例如,可以使用主备热切换的方式,在主节点出现故障时自动切换到备用节点,以保证系统的持续稳定运行。同时还可以使用心跳检测、故障检测等技术来监控数据库节点的健康状态,及时进行故障的处理和恢复。 总之,通过连接池管理、负载均衡和故障转移等技术手段,可以实现对分表分库架构中不同节点数据库连接的管理和调度,以提高系统的性能和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值