🧑💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:MySQL实战
专栏推荐
- 专门为Redis入门打造的专栏,包含Redis基础知识、基础命令、五大数据类型实战场景、key删除策略、内存淘汰机制、持久化机制、哨兵模式、主从复制、分布式锁等等内容。
链接>>>>>>>>>
《Redis从头学》 - 专门为RabbitMQ入门打造的专栏,持续更新中。。。。。。。。
链接>>>>>>>
《图解RabbitMQ》
🌟前言
本文主要演示使用SpringBoot结合ShardingSphere-JDBC快速实现MySQL的水平分库分表实战,含有详细的步骤说明。
文章目录
- 专栏推荐
- 🌟前言
- 🌟介绍
- 🌟核心概念
- 🌟实战入门
- 案例
- 引入依赖
- 配置文件
- 实体类
- 🌟写在最后
ShardingSphere官网:https://shardingsphere.apache.org/
🌟介绍
ShardingSphere-JDBC是一个轻量级的Java框架,为ShardingSphere的其中一个组件。在使用时只需在应用程序中引入其jar包即可,可以理解为增强版的JDBC驱动。
🌟核心概念
- 数据节点Node:数据节点是数据分片中的最小单元,格式为
数据源名称.数据表名称
,ds0.product。 - 真实表:真实表为数据库真实存在的表,也就是分片之后的表,比如ds0.product_0,ds0.product_1
- 逻辑表:逻辑表可以理解为拆分的基表,水平拆分相同逻辑、相同结构表的总称。比如product表。
- 绑定表:绑定表是指具有主子表关系的两个表。比如product_order_0,product_order_item_0。
- 广播表:所有分片数据源中存在的表,比如说字典表的使用。
🌟实战入门
案例
入门实战将从以下几点展开:
- 将product_order表,水平拆分到两个数据库,每个数据库两张表。
- 广播表的拆分。
- 绑定表的拆分。
引入依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
配置文件
配置流程:
- 实体类中配置逻辑表名称。见
实体类小节代码
- 配置数据源名称。
- 配置数据源连接配置。
- 配置workID用户保证雪花算法生成id的唯一性。
- 将ID生成策略配置为雪花算法。
- 为product_order、product_order_item表配置数据节点。
- 配置默认分库规则
- 为product_order、product_order_item表配置分片规则:分片键+分片算法。
- 配置广播表。
- 配置绑定表。
配置文件中的分片策略采用行表达式法,使用groovy语言。
ds$->{0…1}=ds0/ds1;
#配置数据源名称
spring.shardingsphere.datasource.names=ds0,ds1
#详细配置每个数据源
# 第一个数据库
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://127.0.0.1:3306/shop_order_0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
# 第二个数据库
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://127.0.0.1:3306/shop_order_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
#配置workid
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1
#id生成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE
#配置product_order数据节点ds$->{0..1}.product_order_$->{0..1}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1}
#配置product_order_item数据节点
spring.shardingsphere.sharding.tables.product_order_item.actual-data-nodes=ds$->{0..1}.product_order_item_$->{0..1}
#Product_order配置分库规则
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.product_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
#配置默认分库策略
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
#某个表Product_order指定分片策略-->分片键+分片算法
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2}
#某个表Product_order_item指定分片策略-->分片键+分片算法
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.sharding-column=product_order_id
spring.shardingsphere.sharding.tables.product_order_item.table-strategy.inline.algorithm-expression=product_order_$->{product_order_id % 2}
#配置广播表,多个采用,分割
spring.shardingsphere.sharding.broadcast-tables=ad_config
spring.shardingsphere.sharding.tables.ad_config.key-generator.column=id
spring.shardingsphere.sharding.tables.ad_config.key-generator.type=SNOWFLAKE
#配置绑定表
spring.shardingsphere.sharding.binding-tables=product_order,product_order_item
实体类
以下实体类中的@Table注解的值为逻辑表的名称。
@Data
@TableName("product_order")
@EqualsAndHashCode(callSuper = false)
public class ProductOrderDO {
private Long id;
private String outTradeNo;
private String state;
private Date createTime;
private Double payAmount;
private String nickname;
private Long userId;
}
@Data
@TableName("product_order_item")
public class ProductOrderItemDO {
private Long id;
//分表
private Long productOrderId;
private Long productId;
private String productName;
private Integer buyNum;
//分库
private Long userId;
}
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ad_config")
public class AdConfigDO {
private Long id;
private String configKey;
private String configValue;
private String type;
}
🌟写在最后
有关于ShardingSphere-JDBC分库分表快速入门实战到此结束了。文中有错误之处或者大家有什么疑问,欢迎在评论区留言。最后感谢大家的阅读