ShardingJdbc分表
前言
官网原话:
- Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
- Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。
- Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。
- ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目。
一、ShardingJdbc分表
- 水平拆分:统一个表的数据拆到不同的库不同的表中。可以根据时间、地区、或某个业务键维度,也可以通过hash进行拆分,最后通过路由访问到具体的数据。拆分后的每个表结构保持一致。
- 垂直拆分:就是把一个有很多字段的表给拆分成多个表,或者是多个库上去。每个库表的结构都不一样,每个库表都包含部分字段。一般来说,可以根据业务维度进行拆分,如订单表可以拆分为订单、订单支持、订单地址、订单商品、订单扩展等表;也可以,根据数据冷热程度拆分,20%的热点字段拆到一个表,80%的冷字段拆到另外一个表。
准备工作
- 准备一个数据库test-db。
- 数据库下方创建user0和user1表即可。
- 数据表规则:年龄为偶数的放入user0库,奇数的放入user1库。
1.引入maven依赖
代码如下(示例):
<properties>
<java.version>1.8</java.version>
<sharding-sphere.version>4.0.0-RC1</sharding-sphere.version>
</properties>
<dependencies>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--依赖sharding-jdbc-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${sharding-sphere.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-core-common</artifactId>
<version>${sharding-sphere.version}</version>
</dependency>
<!--依赖数据源druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>
2.yml配置
代码如下(示例):
server:
port: 9074
spring:
main:
allow-bean-definition-overriding: true
shardingsphere:
# 参数配置,显示sql
props:
sql:
show: true
# 配置数据源
datasource:
names: ds0
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: admin123
maxPoolSize: 100
minPoolSize: 5
sharding:
default-data-source-name: ds0
# 配置分表的规则
tables:
# user 逻辑表名
user:
# 数据节点:逻辑表名$->{0..N}
actual-data-nodes: ds0.user$->{0..1}
# 拆分表策略,也就是什么样子的数据放到哪个数据表中。
table-strategy:
inline:
sharding-column: age # 分片字段(分片键)
algorithm-expression: user$->{age % 2} # 分片算法表达式
#整合mybatis-plus的sql打印日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
2.分表功能测试
数据库创建user0,user1表
代码如下(示例):
/**
* 分表测试
*/
@Test
public void test02(){
//循环赋值数据便于测试分表插入功能
List<User> list = new ArrayList<>();
for (int i = 10; i <= 20; i++) {
User user = new User();
user.setAge(i);
user.setEmail("101834@qq.com");
user.setName("张三");
list.add(user);
}
service.saveBatch(list);
}
控制台打印输出
JDBC Connection [org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.ShardingConnection@74b00247] will be managed by Spring
==> Preparing: INSERT INTO user ( id, NAME, age, email ) VALUES ( ?, ?, ?, ? )
==> Parameters: 1591659523055005697(Long), 张三(String), 10(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017154(Long), 张三(String), 11(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017155(Long), 张三(String), 12(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017156(Long), 张三(String), 13(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017157(Long), 张三(String), 14(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017158(Long), 张三(String), 15(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017159(Long), 张三(String), 16(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017160(Long), 张三(String), 17(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017161(Long), 张三(String), 18(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017162(Long), 张三(String), 19(Integer), 101834@qq.com(String)
==> Parameters: 1591659524372017163(Long), 张三(String), 20(Integer), 101834@qq.com(String)
数据库表数据展示
总结
这里就只讲解了ShardingJdbc分表的功能,如果想要学习分库的话,可以参考如下ShardingJdbc分库分表学习笔记及视频讲解
具体内容讲解出自:b站UP主:遇见狂神说、小飞非-学相伴
ShardingJdbc分库分表学习笔记
ShardingJdbc分库分表视频讲解