利用Sharding-Jdbc组件实现分表

 更新时间:2018年07月25日 16:55:26   作者:huangheng_01  
这篇文章主要为大家详细介绍了利用Sharding-Jdbc组件实现分表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

测试实现过程

前提:已经实现srping+mybatis对单库单表做增删改查的项目。

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配置文件中。

需要修改几个地方,把sqlSessionFactory和transactionManager原来关联的dataSource统一修改为shardingDataSource(这一步作用就是把数据源全部托管给sharding去管理)

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、配置完成,可以实现增删改查测试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java导出Word文档的实现方法详解

    Java导出Word文档的实现方法详解

    这篇文章主要给大家介绍了关于Java导出Word文档的实现方法,在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等,需要的朋友可以参考下
    2023-08-08
  • Java并发容器相关知识总结

    Java并发容器相关知识总结

    今天给大家带来的文章是Java并发容器的相关知识,文中有非常详细的介绍,对正在学习Java并发容器的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Java打乱ArrayList生成一个随机序列列表

    Java打乱ArrayList生成一个随机序列列表

    有时候会需要将一个ArrayList或者数组中的数字打乱,方便后续使用,比如随机出题、答案选项打乱、连线题打乱、抽奖号码打乱等等,把我自己写的一段代码贴出来分享给大家。
    2016-08-08
  • 解决异常FileNotFoundException:class path resource找不到资源文件的问题

    解决异常FileNotFoundException:class path resource找不到资源文件的问题

    今天小编就为大家分享一篇关于解决异常FileNotFoundException:class path resource找不到资源文件的问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Mybatis动态元素if的使用方式

    Mybatis动态元素if的使用方式

    这篇文章主要介绍了Mybatis动态元素if的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java遍历输出指定目录、树形结构所有文件包括子目录下的文件

    Java遍历输出指定目录、树形结构所有文件包括子目录下的文件

    这篇文章主要介绍了Java遍历输出指定目录、树形结构下的所有文件包括子目录中的文件,需要的朋友可以参考下
    2015-07-07
  • SpringBoot启动器Starters使用及原理解析

    SpringBoot启动器Starters使用及原理解析

    这篇文章主要介绍了SpringBoot启动器Starters使用及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java中的信息摘要算法MessageDigest类用法详解

    Java中的信息摘要算法MessageDigest类用法详解

    这篇文章主要介绍了Java中的信息摘要算法MessageDigest类用法详解,java.security.MessageDigest类为应用程序提供信息摘要算法的功能,如MD5或SHA-1或SHA-256算法,信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值,需要的朋友可以参考下
    2024-01-01
  • Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)

    这篇文章主要介绍了Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏(超详细版)的相关资料,需要的朋友可以参考下
    2016-09-09
  • Java多线程中的CyclicBarrier详解

    Java多线程中的CyclicBarrier详解

    这篇文章主要介绍了Java多线程中的CyclicBarrier详解,同步屏障,允许一组线程互相等待以到达一个公共的障碍点,当设定的线程数到达屏障时,阻塞的线程继续执行,需要的朋友可以参考下
    2023-11-11

最新评论