sharding-sphere 4.1.1 分表实战
技术栈
Springboot + sharding-sphere 4.1.1 + mybatis-plus
安装教程
- 初始化数据库脚本(创建三张表 t_user_info_01、t_user_info_02、t_user_info_03)
CREATE TABLE `t_user_info_01` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`age` int DEFAULT NULL COMMENT '年龄',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `t_user_info_02` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`age` int DEFAULT NULL COMMENT '年龄',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `t_user_info_03` (
`id` bigint NOT NULL COMMENT '主键',
`name` varchar(255) DEFAULT NULL COMMENT '名称',
`age` int DEFAULT NULL COMMENT '年龄',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
- 配置分表策略
spring:
sharding-sphere:
datasource:
names: ds0
ds0:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: jdbc:mysql://localhost:3306/sharding-sphere?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
sharding:
tables:
# 虚拟表名
t_user_info:
# 真实表名
actual-data-nodes: ds0.t_user_info_0$->{1..3}
table-strategy:
inline:
# 根据年龄字段分表
sharding-column: age
algorithm-expression: t_user_info_0$->{age % 3 + 1}
使用说明
- 插入数据
@PostMapping("/insert")
public void insert(@RequestBody TUserInfo userInfo) {
List<TUserInfo> tUserInfos = new ArrayList<>();
for (int i = 0; i < 60; i++) {
TUserInfo tUserInfo = BeanUtil.copyProperties(userInfo, TUserInfo.class);
tUserInfo.setAge(i);
tUserInfo.setCreateTime(LocalDateTime.now());
tUserInfos.add(tUserInfo);
}
userInfoService.saveBatch(tUserInfos);
}
- 查看插入数据分布
- t_user_info_01
- t_user_info_02
- t_user_info_03
- 查询数据
@GetMapping("/list/page")
public IPage<TUserInfo> queryPage() {
IPage<TUserInfo> page = new Page<>();
page.setSize(10);
page.setCurrent(3);
return userInfoService.selectPageVo(page);
}
- JDK17 问题解决
jdk17插入数据可能会报以下错误
Unable to make field private static final long java.lang.Number.serialVersionUID accessible: module java.base does not "opens java.lang" to unnamed module @4ac3c60d
在Java 9及以后的版本中,引入了模块化系统,它允许将代码和资源划分为多个模块以提高代码的可维护性和安全性。然而,由于模块的隔离性,某些代码可能无法在模块之间进行正常的交互。这时,我们可以使用Java --add-opens选项来解决此类问题
加入以下配置
--add-opens
java.base/java.util=ALL-UNNAMED
--add-opens
java.base/java.lang=ALL-UNNAMED
--add-opens
java.base/java.math=ALL-UNNAMED
--add-opens
java.base/java.util.concurrent=ALL-UNNAMED
--add-opens
java.base/java.net=ALL-UNNAMED
--add-opens
java.base/java.text=ALL-UNNAMED