mysql--使用shardingsphere实现分库分表

一.简介

本节将继续通过ShardingSphere实现分库分表

上一节的分表中已经介绍过了使用的分表策略,接下来介绍一下分库策略

ShardingSphere提供如下四种分库策略:

1. standard: #用于单分片键的标准分片场景

2. complex: #用于多分片键的复合分片场景

3. inline: #行表达式分片策略

4. hint: #Hint分片策略

本篇文章使用的是inline行表达式分片策略

关于各种分片策略,可以到手册进行查看

 二.数据库设计

本篇文章使用两个数据库,每个数据库两张表进行简单的演示。

ds0库:

 

 ds1库于ds0两个库数据结构一致

三.编码阶段

1. 引入主要依赖

 1 <dependency>
 2             <groupId>org.mybatis.spring.boot</groupId>
 3             <artifactId>mybatis-spring-boot-starter</artifactId>
 4             <version>2.2.0</version>
 5         </dependency>
 6         <!--druid数据源-->
 7         <dependency>
 8             <groupId>com.alibaba</groupId>
 9             <artifactId>druid-spring-boot-starter</artifactId>
10             <version>1.2.1</version>
11         </dependency>
12         <!--shardingsphere-->
13         <dependency>
14             <groupId>org.apache.shardingsphere</groupId>
15             <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
16             <version>4.0.0-RC1</version>
17         </dependency>
18         <dependency>
19             <groupId>org.apache.shardingsphere</groupId>
20             <artifactId>sharding-jdbc-spring-namespace</artifactId>
21             <version>4.0.0-RC1</version>
22         </dependency>
23         <!--jdbc-->
24         <dependency>
25             <groupId>mysql</groupId>
26             <artifactId>mysql-connector-java</artifactId>
27             <version>8.0.22</version>
28         </dependency>
View Code

2. 配置文件

本篇文章数据库分片策略中使用了inline行表达式分片策略

对age字段进行了hash取模运算来进行分片;

数据表分片策略同分库策略

分表需要指定表节点:

actualDataNodes: #由数据源名 + 表名组成,以小数点分隔。多个表以逗号分隔,支持inline表达式。缺省表示使用已知数据源与逻辑表名称生成数据节点,用于广播表(即每个库中都需要一个同样的表用于关联查询,多为字典表)或只分库不分表且所有库的表结构完全一致的情况

 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<TabUser> userList = new ArrayList<TabUser>();
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:

  

posted @ 2021-10-09 16:16  EchoLv  阅读(482)  评论(0编辑  收藏  举报