ShardingSphere实现分库分表

ShardingSphere实现分库分表

介绍

分布式数据库中间件,提供 数据水平 &垂直拆分、分布式事务、数据服务治理等需求解决方案。

架构图

ShardingSphere-JDBC

  • 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
  • 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。

分库分表例子

代码

https://github.com/sanqianyuejiamk/springboot-ShardingSphere-demo

初始化数据库

import.sql

CREATE SCHEMA `ds0` DEFAULT CHARACTER SET utf8 ;
CREATE SCHEMA `ds1` DEFAULT CHARACTER SET utf8 ;

CREATE TABLE `ds0`.`tab_user0` (
  `id` BIGINT(32) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `sex` VARCHAR(1) NULL,
  `age` INT NULL,
  `status` INT NULL,
  `create_time` DATETIME NULL,
  `update_time` DATETIME NULL,
  PRIMARY KEY (`id`));

CREATE TABLE `ds0`.`tab_user1` (
  `id` BIGINT(32) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `sex` VARCHAR(1) NULL,
  `age` INT NULL,
  `status` INT NULL,
  `create_time` DATETIME NULL,
  `update_time` DATETIME NULL,
  PRIMARY KEY (`id`));

CREATE TABLE `ds1`.`tab_user0` (
  `id` BIGINT(32) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `sex` VARCHAR(1) NULL,
  `age` INT NULL,
  `status` INT NULL,
  `create_time` DATETIME NULL,
  `update_time` DATETIME NULL,
  PRIMARY KEY (`id`));

CREATE TABLE `ds1`.`tab_user1` (
  `id` BIGINT(32) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NULL,
  `sex` VARCHAR(1) NULL,
  `age` INT NULL,
  `status` INT NULL,
  `create_time` DATETIME NULL,
  `update_time` DATETIME NULL,
  PRIMARY KEY (`id`));

分片规则

根据年龄分库 一共分为2个库

shardingColumn:"age", algorithmExpression:"ds${age % 2}"

根据ID分表 一共分为2张表  

shardingColumn:"id", new PreciseModuloShardingTableAlgorithm()

 

public final class PreciseModuloShardingTableAlgorithm implements PreciseShardingAlgorithm<Long> {

    @Override
    public String doSharding(final Collection<String> tableNames, final PreciseShardingValue<Long> shardingValue) {
        for (String each : tableNames) {
            if (each.endsWith(shardingValue.getValue() % 2 + "")) {
                return each;
            }
        }
        throw new UnsupportedOperationException();
    }
}

批量插入数据

http://localhost:8088/save-user

分库分表存储数据  

ds0.tab_user0

  

ds0.tab_user1

 

ds1.tab_user1

参考文档

[1]: https://www.infoq.cn/article/1qvyzw9w*yuf685kybkq
[2]: https://github.com/yudiandemingzi/spring-boot-sharding-sphere
[3]: https://shardingsphere.apache.org/document/current/cn/overview/#%E6%B7%B7%E5%90%88%E6%9E%B6%E6%9E%84

  

 

posted on 2020-12-06 11:42  rabbit-xf  阅读(191)  评论(0)    收藏  举报