ShardingSphere 入门教程之六
大纲
- ShardingSphere 入门教程之一、ShardingSphere 入门教程之二、ShardingSphere 入门教程之三
- ShardingSphere 入门教程之四、ShardingSphere 入门教程之五、ShardingSphere 入门教程之六
前言
学习资源
- ShardingSphere 官方项目(GitHub)
- ShardingSphere 官方网站(中文站点)
- ShardingSphere 官方文档(最新版本)
- ShardingSphere 官方文档(5.1.1 版本)
ShardingSphere-JDBC 使用
水平分库使用案例
广播表使用案例
提示
本节将演示 SpringBoot + MyBatis-Plus 如何整合 ShardingSphere-JDBC,并使用广播表。完整的案例代码可以直接从 GitHub 下载对应章节 sharding-sphere-lesson-06
核心概念
广播表的简介:
- 广播表是指所有的分片数据源中都存在的表,且表结构及其表数据(包括主键值)在每个数据库中均完全一致。
- 适用于数据量不大,且需要与海量数据的表进行关联查询(
JOIN)的场景,例如:字典表。
广播表的特性:
- 数据变更会同步到所有分片节点
- 对广播表执行
INSERT、UPDATE、DELETE操作时,ShardingSphere-JDBC 会将变更操作同时广播到所有数据源,确保各节点的数据完全一致。
- 对广播表执行
- 查询操作可在任意节点完成
- 广播表的数据在所有节点中一致,因此查询时可从任意一个数据源获取结果(通常基于负载均衡策略选择节点)。
- 可与任意表进行
JOIN- 广播表在所有节点都有一份完整数据,不涉及跨节点聚合,因此可以安全、方便地与任意分片表或非分片表进行
JOIN操作。
- 广播表在所有节点都有一份完整数据,不涉及跨节点聚合,因此可以安全、方便地与任意分片表或非分片表进行
- 数据变更会同步到所有分片节点
准备工作
版本说明
本案例所使用的组件版本如下表所示:
| 组件 | 版本要求 |
|---|---|
| JDK | 11 |
| MySQL | 8.0.29 |
| SpringBoot | 2.7.18 |
| ShardingSphere-JDBC | 5.1.1 |
数据库规划
本案例是在两个 MySQL 数据库上实现的,数据库的规划如下图所示:

| 数据库服务器 | IP | 端口 | 库的名称 | 表的名称 |
|---|---|---|---|---|
订单数据库服务器一(server-order0) | 192.168.2.191 | 3310 | db_order | t_dict |
订单数据库服务器二(server-order1) | 192.168.2.191 | 3311 | db_order | t_dict |
数据库部署
- 部署订单数据库服务器一(
server-order0)
1 | # 创建并启动 MySQL 容器(Docker 会自动在宿主机上创建不存在的目录) |
- 更改订单数据库服务器一(
server-order0)的默认密码校验方式
1 | # 进入容器内,其中环境变量 "env LANG=C.UTF-8" 用于避免容器内显示中文乱码的问题 |
- 部署订单数据库服务器二(
server-order1)
1 | # 创建并启动 MySQL 容器(Docker 会自动在宿主机上创建不存在的目录) |
- 更改订单数据库服务器二(
server-order1)的默认密码校验方式
1 | # 进入容器内,其中环境变量 "env LANG=C.UTF-8" 用于避免容器内显示中文乱码的问题 |
数据库初始化
- 在订单数据库服务器一(
server-order0)中,执行以下 SQL 语句:
1 | -- 创建数据库 |
- 在订单数据库服务器二(
server-order1)中,执行以下 SQL 语句:
1 | -- 创建数据库 |
案例代码
添加依赖
1 | <properties> |
创建实体类
- 字典实体类(特别注意:由于广播表的表结构及其表数据(包括主键值)在每个数据库中均完全一致,因此可以使用 MyBatis-Plus 内置的
ASSIGN_ID(基于雪花算法)主键生成策略来生成 ID)
1 | import com.baomidou.mybatisplus.annotation.IdType; |
创建 Mapper
- 字典 Mapper
1 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
配置数据分片
- 创建配置文件(
application.properties),配置数据分片
1 | # ----------基础配置---------- |
官方文档
测试代码
插入数据测试
1 |
|
测试代码运行后的输出结果如下(可以发现,往不同数据库服务器中的 t_dict 表插入数据时,该数据的主键(ID)值都是相同的):
1 | 2020-09-11 23:10:46.695 INFO 15426 --- [ main] ShardingSphere-SQL : Logic SQL: INSERT INTO t_dict ( id, dict_type, dict_code, dict_value ) VALUES ( ?, ?, ?, ? ) |
查询数据测试
1 |
|
测试代码运行后的输出结果如下(可以发现,最终只会从任意一个节点查询数据,默认是基于随机负载均衡规则):
1 | 2020-09-11 23:12:36.145 INFO 16016 --- [ main] ShardingSphere-SQL : Logic SQL: SELECT id,dict_type,dict_code,dict_value FROM t_dict |
