大家好,我是工藤学编程 | 一个正在努力学习的小博主,期待你的关注 |
---|---|
实战代码系列最新文章 | C++实现图书管理系统(Qt C++ GUI界面版) |
SpringBoot实战系列 | 【SpringBoot实战系列】Sharding-Jdbc实现分库分表到分布式ID生成器Snowflake自定义wrokId实战 |
环境搭建大集合 | 环境搭建大集合(持续更新) |
分库分表 | 分库分表之实战-sharding-JDBC广播表 |
前情摘要:
1、数据库性能优化
2、分库分表之优缺点分析
3、分库分表之数据库分片分类
4、分库分表之策略
5、分库分表技术栈讲解-Sharding-JDBC
6、分库分表下的 ID 冲突问题与雪花算法讲解
7、分库分表之实战-sharding-JDBC
8、分库分表之实战-sharding-JDBC广播表
【亲测宝藏】发现一个让 AI 学习秒变轻松的神站!不用啃高数、不用怕编程,高中生都能看懂的人工智能教程来啦!
点击跳转,和 thousands of 小伙伴一起用快乐学习法征服 AI,说不定下一个开发出爆款 AI 程序的就是你!
前言:
项目工程紧接:分库分表之实战-sharding-JDBC广播表。
核心分片策略
user_id
取模分片(user_id % 2
),确保同一用户的订单集中在同一库product_order_id
(订单号)取模分片(product_order_id % 2
),分散单库内的数据压力首先我们将之前章节产生的数据清除,避免印象本章节的测试
然后application.properties中新增内容,将之前分表规则由user_id改为订单自身的id,并且需要将真实节点改为库+表
#配置分库规则
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}
#将之前分表规则由user_id改为订单自身的id
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}
#原本为ds0.product_order_$->{0..1}
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds$->{0..1}.product_order_$->{0..1}
在DbTest中新增单元测试函数
@Test
public void testSaveProductOrderDB(){
Random random = new Random();
for(int i=0;i<20;i++){
ProductOrderDO productOrder = new ProductOrderDO();
productOrder.setCreateTime(new Date());
productOrder.setNickname("ccc_i="+i);
productOrder.setOutTradeNo(UUID.randomUUID().toString().substring(0,32));
productOrder.setPayAmount(100.00);
productOrder.setState("PAY");
productOrder.setUserId(Math.abs(random.nextLong()));
productOrderMapper.insert(productOrder);
}
}
1. SQL执行日志(关键输出)
INSERT INTO product_order (id, out_trade_no, state, create_time, pay_amount, nickname, user_id) VALUES (?, ?, ?, ?, ?, ?, ?)
#路由到ds1.product_order_0:
INSERT INTO product_order_0 (...) VALUES (...) ::: [1942559776326320130, 70bd5220-1c9c-4e3e-b418-85481f60, PAY, 2025-07-08 20:21:56.32, 100.0, ccc_i=0, 204402002533403893]
#路由到ds0.product_order_1
INSERT INTO product_order_1 (...) VALUES (...) ::: [1942559778821931009, 3fe7e14a-e75b-4c44-905e-7cc4efb3, PAY, 2025-07-08 20:21:56.952, 100.0, ccc_i=1, 164530429416077594]
1. 分片键选择建议
user_id
分布不均(如某些用户订单量极大),可考虑复合分片(如user_id + 时间
)user_id
查询订单时,分片键选择user_id
可避免跨库查询)2. 跨库查询解决方案
ShardingSphere
的StreamResultSet
接口实现结果聚合3. 分布式事务处理
Sharding-JDBC原生支持BASE事务(通过XA
或柔性事务
),若订单涉及跨库更新(如扣库存),需结合Seata
等分布式事务框架。
通过本案例实现的2库4表架构,可带来以下收益:
适用场景:订单系统、交易记录、用户日志等数据量大且写入频繁的业务场景。
觉得有用请点赞收藏!
如果有相关问题,欢迎评论区留言讨论~