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>
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
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 }
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