首页 > 编程 > Java > 正文

利用Sharding-Jdbc组件实现分表

2019-11-26 09:47:04
字体:
来源:转载
供稿:网友

看到了当当开源的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、配置完成,可以实现增删改查测试。

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表