利用Sharding-Jdbc实现分表

匿名 (未验证) 提交于 2019-12-02 21:53:52

闲来无事,喜欢研究一些自己未接触过的技术~

看到了当当开源的Sharding-JDBC组件,它可以在几乎不修改代码的情况下完成分库分表的实现。摘抄其中一段介绍:

直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零:

  • 可适用于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC

  • 可基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid等。

  • 理论上可支持任意实现JDBC规范的数据库。虽然目前仅支持MySQL,但已有支持Oracle,SQLServer,DB2等数据库的计划。

先做一个最简单的试用,不做分库,仅做分表。选择数据表bead_information,首先复制成三个表:bead_information_0、bead_information_1、bead_information_2

测试实现过程

1、修改pom.xml增加dependency

        <dependency>             <groupId>com.dangdang</groupId>             <artifactId>sharding-jdbc-core</artifactId>             <version>1.4.2</version>         </dependency>         <dependency>             <groupId>com.dangdang</groupId>             <artifactId>sharding-jdbc-config-spring</artifactId>             <version>1.4.0</version>         </dependency>    

2、新建一个sharding-jdbc.xml文件,实现分库分表的配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:context="http://www.springframework.org/schema/context"      xmlns:tx="http://www.springframework.org/schema/tx"     xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"     xsi:schemaLocation="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans.xsd                          http://www.springframework.org/schema/tx                          http://www.springframework.org/schema/tx/spring-tx.xsd                         http://www.springframework.org/schema/context                          http://www.springframework.org/schema/context/spring-context.xsd                         http://www.dangdang.com/schema/ddframe/rdb                          http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd">                  <!-- 配置数据源 -->     <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">         <property name="url" value="jdbc:mysql://localhost:3306/beadhouse" />         <property name="username" value="root" />         <property name="password" value="123456" />     </bean>                       <rdb:strategy id="tableShardingStrategy" sharding-columns="id" algorithm-class="com.springdemo.utill.MemberSingleKeyTableShardingAlgorithm"/>          <rdb:data-source id="shardingDataSource">         <rdb:sharding-rule data-sources="dataSource">             <rdb:table-rules>                 <rdb:table-rule logic-table="bead_information" actual-tables="bead_information_${0..2}"  table-strategy="tableShardingStrategy"/>             </rdb:table-rules>         </rdb:sharding-rule>     </rdb:data-source>          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">         <property name="dataSource" ref="shardingDataSource" />     </bean> </beans>

3、将文件引入spring配置文件中。

4、实现分表(分库)逻辑,我们的分表逻辑类需要实现SingleKeyTableShardingAlgorithm接口的三个方法doBetweenSharding、doEqualSharding、doInSharding

(取模除数需要按照自己需求改变,我这里分3个表,所以除以3)

import java.util.Collection; import java.util.LinkedHashSet; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm; import com.google.common.collect.Range; public class MemberSingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Integer> {      @Override     public Collection<String> doBetweenSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {         Collection<String> result = new LinkedHashSet<String>(tableNames.size());         Range<Integer> range = (Range<Integer>) shardingValue.getValueRange();         for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {             Integer modValue = i % 3;             String modStr = modValue < 3 ? "" + modValue : modValue.toString();             for (String each : tableNames) {                 if (each.endsWith(modStr)) {                     result.add(each);                 }             }         }         return result;     }     @Override     public String doEqualSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {         Integer modValue = shardingValue.getValue() % 3;         String modStr = modValue < 3 ? "" + modValue : modValue.toString();         for (String each : tableNames) {             if (each.endsWith(modStr)) {                 return each;             }         }         throw new IllegalArgumentException();     }     @Override     public Collection<String> doInSharding(Collection<String> tableNames, ShardingValue<Integer> shardingValue) {         Collection<String> result = new LinkedHashSet<String>(tableNames.size());         for (Integer value : shardingValue.getValues()) {             Integer modValue = value % 3;             String modStr = modValue < 3 ? "" + modValue : modValue.toString();             for (String tableName : tableNames) {                 if (tableName.endsWith(modStr)) {                     result.add(tableName);                 }             }         }         return result;     } }

5、配置完成,可以实现增删改查测试。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!