mysql分表组件_利用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

471e1c56e93720530e7a0bdf7c323af8.png

测试实现过程

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

1、修改pom.xml增加dependency

com.dangdang

sharding-jdbc-core

1.4.2

com.dangdang

sharding-jdbc-config-spring

1.4.0

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

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

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

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

4d6e531318c321f8c2de8fb335972f81.png

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 {

@Override

public Collection doBetweenSharding(Collection tableNames, ShardingValue shardingValue) {

Collection result = new LinkedHashSet(tableNames.size());

Range range = (Range) 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 tableNames, ShardingValue 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 doInSharding(Collection tableNames, ShardingValue shardingValue) {

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值