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