网站首页 > 基础教程 正文
随着数据体量的不断增加,传统的单一数据库的性能和扩展性也成为了系统扩展的瓶颈,这个时候,我们就需要引入多个数据库多个数据库表来提升系统的查询性能,而在下面我们就来介绍一下在实际开发中使用的比较多的一种分库分表技术ShardingSphere,通过在Spring Boot中引入ShardingSphere来实现分库分表操作来深入的理解一下分库分表操作。
什么是分库分表
分库分表是一种数据库水平拆分策略,通过将数据按一定规则分散到不同的数据库和表中,从而提升数据库的读写性能,以减轻单个数据库的压力。在日常开发中比较常见的分库分表策略有如下几种。
- 按业务分库:意思是将不同的业务数据存放到不同的数据库中,例如将用户数据放在一个库中,而将订单数据放在另一个库中进行存储。
- 水平拆分:所谓的水平拆分是将同一业务数据通过某种规则拆分到多个数据库中进行存储,如用户ID、订单ID等。
而在Spring Boot中想要实现分库分表操作,我们可以采用ShardingSphere中间件来实现,通过ShardingSphere我们可以在应用层中实现分库分表的操作。
使用ShardingSphere实现分库分表
引入依赖
我们可以在应用的POM文件中引入ShardingSphere的依赖配置,如下所示。
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>5.1.0</version>
</dependency>
当然除了上面的配置之外,我们还需要添加上JDBC的依赖配置,如下所示。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
配置数据源和分片规则
依赖引入成功之后,接下来的操作就是要在配置文件中添加相关的分库分表的策略,例如下面我们演示一下如何通过订单ID进行分库分表的配置。
spring:
shardingsphere:
datasource:
names: ds0, ds1
ds0:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_ds_0
username: root
password: password
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/demo_ds_1
username: root
password: password
sharding:
tables:
t_order:
actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
table-strategy:
inline:
sharding-column: order_id
algorithm-expression: t_order_$->{order_id % 2}
database-strategy:
inline:
sharding-column: order_id
algorithm-expression: ds$->{order_id % 2}
default-database-strategy:
none
default-table-strategy:
none
在上面的配置中,分别配置了ds0和ds1两个数据库,t_order表示了订单表,在配置中定了了通过order_id进行取模来进行分库分表操作。在操作的时候会根据配置生成ds0.t_order_0, ds0.t_order_1, ds1.t_order_0, ds1.t_order_1四张表,然后通过order_id % 2的值决定数据应该存储在哪张表中。
配置事务支持
配置好分库策略之后,需要在SpringBoot配置文件中开启分布式事务管理,如下所示。
spring:
shardingsphere:
transaction:
type: LOCAL
这里我们将事务类型设置为了LOCAL表示本地事务,当然也可以设置成XA分布式事务,如果在多个数据库中使用分布式事务,还可以考虑通过Seata等来实现。
测试实现
以MyBatis为例,我们创建订单实体类和对应的Mapper映射接口,如下所示。
@Data
public class Order {
private Long orderId;
private Long userId;
private BigDecimal amount;
private Date createTime;
}
OrderMapper.java
@Mapper
public interface OrderMapper {
void insert(Order order);
Order selectById(Long orderId);
}
接下来,我们就可以在Service层中来调用分库分表操作逻辑,例如我们可以实现订单的插入以及查询操作,ShardingSphere就会根据配置的策略来动态的自动选择数据库和数据表进行数据的存储操作,如下所示。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
public void createOrder(Order order) {
orderMapper.insert(order);
}
public Order getOrderById(Long orderId) {
return orderMapper.selectById(orderId);
}
}
调用createOrder()时,ShardingSphere会自动选择对应的库和表进行数据插入。
注意事项
- 在设计分库分表的时候,需要考虑到系统查询的条件,结合具体的业务特点来进行分库分表策略的制定,避免出现频繁的跨表跨库查询操作来影响系统的性能。
- 在进行分库分表参考做的时候,由于分布式事务的存在可能会导致数据不一致的情况发生,所以在必要的时候需要通过分布式事务管理器来保证分布式数据一致性。
- 在分库分表操作的过程中,分片键的选择非常重要,应选择查询频率高且具备分片特征的字段。通常不建议使用UUID等随机字符串作为分片键。
- 实际场景中可能需要更复杂的分片算法,可以通过ShardingSphere自定义分片算法实现。
总结
在上面的分享中,我们介绍了通过ShardingSphere在SpringBoot中实现分库分表操作,并且将数据按照制定的策略分散存储到了不同的数据库表中,这样做可以有效的提升系统的读写并发性能,在实际开发中,分库分表的设计需要根据具体业务需求来设计合理的分片策略,并尽量避免跨库跨表查询,当然如果在实际开发中遇到了什么其他问题可以在评论区留言,我们一起来讨论讨论。
猜你喜欢
- 2025-01-14 手机帝国存档怎么修改 存档简单修改教程
- 2025-01-14 文档在线预览(四) 总结篇
- 2025-01-14 MySQL数据库表碎片收集整理那些事
- 2025-01-14 刘心向学(8)指针数组的应用
- 2025-01-14 C#控件美化之路(11):控件ListBox增加DataTable数据绑定功能
- 2025-01-14 一文看懂MySQL如何判断InnoDB表是独立表空间还是共享表空间
- 2025-01-14 SpringBoot实现MySQL数据库自动备份管理系统
- 2025-01-14 一键生成数据库文档,从此告别人工整理文档
- 2025-01-14 all about visitor management system you need to know 03
- 2025-01-14 一篇文章教会你进行Mysql数据库和数据表的基本操作
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)