作者:mobiledu2502862913 | 来源:互联网 | 2023-07-22 01:20
一.简介本节将继续通过ShardingSphere实现分库分表上一节的分表中已经介绍过了使用的分表策略,接下来介绍一下分库策略ShardingSphere提供如下四种分库策略:1.
一.简介
本节将继续通过ShardingSphere实现分库分表
上一节的分表中已经介绍过了使用的分表策略,接下来介绍一下分库策略
ShardingSphere提供如下四种分库策略:
1. standard:
本篇文章使用的是inline行表达式分片策略
关于各种分片策略,可以到手册进行查看
二.数据库设计
本篇文章使用两个数据库,每个数据库两张表进行简单的演示。
ds0库:
ds1库于ds0两个库数据结构一致
三.编码阶段
1. 引入主要依赖
1
2 org.mybatis.spring.boot
3 mybatis-spring-boot-starter
4 2.2.0
5
6
7
8 com.alibaba
9 druid-spring-boot-starter
10 1.2.1
11
12
13
14 org.apache.shardingsphere
15 sharding-jdbc-spring-boot-starter
16 4.0.0-RC1
17
18
19 org.apache.shardingsphere
20 sharding-jdbc-spring-namespace
21 4.0.0-RC1
22
23
24
25 mysql
26 mysql-connector-java
27 8.0.22
28
View Code
2. 配置文件
本篇文章数据库分片策略中使用了inline行表达式分片策略
对age字段进行了hash取模运算来进行分片;
数据表分片策略同分库策略
分表需要指定表节点:
actualDataNodes:
1 server:
2 port: 8083
3
4 #mybatis信息
5 mybatis:
6 mapper-locations: classpath:mapping/*Mapper.xml
7 type-aliases-package: com.example.demo.entity
8
9 Spring:
10 shardingsphere:
11 datasource:
12 names: ds0,ds1 #配置数据源 分库分表配置
13 #ds0库
14 ds0:
15 type: com.alibaba.druid.pool.DruidDataSource
16 driver-class-name: com.mysql.cj.jdbc.Driver
17 url: jdbc:mysql://127.0.0.1:3306/ds0?serverTimezOne=Asia/Shanghai&useSSL=false&allowMultiQueries=true
18 username: root
19 password: 123456
20 #ds1库
21 ds1:
22 type: com.alibaba.druid.pool.DruidDataSource
23 driver-class-name: com.mysql.cj.jdbc.Driver
24 url: jdbc:mysql://127.0.0.1:3306/ds1?serverTimezOne=Asia/Shanghai&useSSL=false&allowMultiQueries=true
25 username: root
26 password: 123456
27 sharding:
28 #默认数据库分片策略 根据年龄分库
29 default-database-strategy:
30 #行表达式分片策略
31 inline:
32 #分片字段名称
33 sharding-column: age
34 #分片算法表达式 age 对 2 进行取模运算
35 algorithm-expression: ds$->{age % 2}
36 #数据表分片规则
37 tables:
38 #表名
39 tab_user:
40 #由数据源名 + 表名组成,以小数点分隔。表节点
41 actual-data-nodes: ds$->{0..1}.tab_user$->{0..1}
42 #分表策略
43 table-strategy:
44 inline:
45 #通过id分表
46 sharding-column: id
47 #分片算法表达式
48 algorithm-expression: tab_user$->{id % 2}
49 props:
50 sql:
51 show: true
52 swagger:
53 enable: true
View Code
3. 测试
1 /**
2 * 分库分表测试
3 * @author Lv de yin
4 * @Date 2021/9/3
5 */
6 @RequestMapping("pareDaAndTab/")
7 @RestController
8 public class PartDatabaseAndPartTableController {
9
10 @Autowired
11 private TabUserServiceImpl tabUserService;
12
13 /**
14 * 模拟插入数据
15 */
16 List userList = new ArrayList();
17
18 @PostConstruct
19 private void getData(){
20 userList.add(new TabUser(1,"小小", "女", 3));
21 userList.add(new TabUser(2,"爸爸", "男", 30));
22 userList.add(new TabUser(3,"妈妈", "女", 28));
23 userList.add(new TabUser(4,"爷爷", "男", 64));
24 userList.add(new TabUser(5,"奶奶", "女", 62));
25 }
26
27 @PostMapping("save-user")
28 public Object saveUser(){
29 return tabUserService.saveForeach(userList);
30 }
31
32 @GetMapping("list-user")
33 public Object listUser(){
34 return tabUserService.list();
35 }
36
37 @GetMapping("list-user-order")
38 public Object listUserByOrder(@RequestParam(value = "column") String column,@RequestParam(value = "sort") String sort){
39 return tabUserService.listBySort(column, sort);
40 }
41 }View Code
4. 测试结果
插入测试:
- 第一条数据小小,通过age字段对2取模得到1,被分到ds1库,通过id字段对2取模得到1,分到tab_user1表。
ds0库:
tab_user0:
tab_user1:
ds1库:
tab_user0:
tab_user1:
本文来自博客园,作者:EchoLv,转载请注明原文链接:https://www.cnblogs.com/lvdeyinBlog/p/15386325.html