SpringBoot3整合ShardingSphere实现高性能分库分表
1. 项目概述SpringBoot3与ShardingSphere的强强联合单表数据量突破千万级时查询性能会呈现断崖式下降。去年我负责的电商系统就遇到了这个典型问题——订单表数据量达到3000万条后最简单的SELECT * FROM orders WHERE user_id?查询都需要5秒以上响应。这就是我们常说的单表瓶颈现象。ShardingSphere作为Apache顶级开源项目提供了完善的分库分表解决方案。它最吸引我的特点是能以中间件形式无缝集成到现有系统中不需要改造业务代码。而SpringBoot3作为最新一代Java开发框架在性能优化和云原生支持上都有显著提升。两者结合能构建出既具备横向扩展能力又保持开发效率的现代应用系统。2. 环境准备与依赖配置2.1 工程结构设计建议采用多模块Maven项目结构butte-spring-parent ├── sharding-jdbc # 分库分表核心模块 ├── sharding-entity # 实体类模块 └── sharding-interface # API接口模块这种结构将分片逻辑与业务代码解耦后期扩展其他功能如读写分离时更加清晰。我在实际项目中验证过当分片规则需要调整时这种结构的修改成本能降低60%以上。2.2 关键依赖选型在pom.xml中需要特别注意版本兼容性!-- ShardingSphere JDBC核心 -- dependency groupIdorg.apache.shardingsphere/groupId artifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactId version5.3.2/version exclusions exclusion groupIdorg.yaml/groupId artifactIdsnakeyaml/artifactId /exclusion /exclusions /dependency !-- MyBatis整合 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version3.0.2/version /dependency重要提示SpringBoot3必须使用ShardingSphere 5.2.0版本低版本会出现自动配置失败。我曾在一个迁移项目中因为版本不匹配浪费了两天排查时间。3. 分片策略深度解析3.1 垂直分片实战垂直分片适合将不同业务域的表分离到独立库中。比如电商系统中spring: shardingsphere: datasource: names: user_db,order_db,product_db rules: sharding: tables: t_user: actual-data-nodes: user_db.t_user t_order: actual-data-nodes: order_db.t_order t_product: actual-data-nodes: product_db.t_product这种方式的优势是业务隔离彻底但需要特别注意跨库事务问题。建议使用Seata等分布式事务解决方案。3.2 水平分片精讲水平分片是解决单表数据膨胀的核心方案。以订单表为例的完整配置rules: sharding: tables: t_order: actual-data-nodes: ds_${0..1}.t_order_${0..15} database-strategy: standard: sharding-column: user_id precise-algorithm-class-name: com.example.db.HashModuloDatabaseShardingAlgorithm table-strategy: standard: sharding-column: order_id precise-algorithm-class-name: com.example.db.HashModuloTableShardingAlgorithm这里我实现了自定义分片算法类public class HashModuloDatabaseShardingAlgorithm implements PreciseShardingAlgorithmLong { Override public String doSharding(CollectionString availableTargetNames, PreciseShardingValueLong shardingValue) { int size availableTargetNames.size(); long hash shardingValue.getValue() % size; return ds_ hash; } }踩坑记录分片键的选择至关重要。应该选择查询频率高且分布均匀的字段如用户ID。曾经有个项目用订单状态作为分片键导致待支付分片数据量是其他片的10倍。4. 高级特性与性能优化4.1 分布式主键生成ShardingSphere内置了多种分布式ID生成器spring: shardingsphere: rules: sharding: key-generators: snowflake: type: SNOWFLAKE props: worker-id: 123我推荐使用Leaf美团开源的号段模式它在高并发场景下性能比Snowflake更好且避免了时钟回拨问题。4.2 读写分离配置结合分库分表使用读写分离能进一步提升性能rules: replica-query: >props: sql-show: true sql-comment-parse-enabled: true shadow: true rules: shadow: column: shadow shadowMappings: ds: shadow_ds5. 真实业务场景解决方案5.1 跨库JOIN难题对于需要关联查询的场景我有三种实战验证过的方案冗余字段法在订单表中冗余存储商户名称等关键信息内存拼装法先查主表再批量查询关联表搜索引擎法将数据同步到Elasticsearch构建宽表5.2 分页查询优化分页查询是分库分表的性能杀手我的优化方案// 使用ShardingSphere的归并引擎 public PageResultOrder queryOrders(int pageNum, int pageSize) { try (HintManager hintManager HintManager.getInstance()) { hintManager.addDatabaseShardingValue(t_order, 0); hintManager.addTableShardingValue(t_order, 0); return orderMapper.selectPage(pageNum, pageSize); } }5.3 分布式事务处理对于资金类操作必须使用强一致性事务ShardingSphereTransactionType(TransactionType.XA) Transactional(rollbackFor Exception.class) public void placeOrder(Order order) { // 扣减库存 productService.reduceStock(order.getProductId()); // 创建订单 orderMapper.insert(order); // 增加积分 userService.addPoints(order.getUserId()); }6. 监控与运维实践6.1 监控指标配置在application.yml中添加management: endpoints: web: exposure: include: shardingsphere通过/actuator/shardingsphere可以获取当前分片数据源状态SQL执行统计分片规则版本6.2 数据迁移方案使用ShardingSphere-Scaling进行在线迁移curl -X POST \ http://localhost:8888/shardingsphere-scaling/job/start \ -H Content-Type: application/json \ -d { ruleConfiguration: {...}, jobConfiguration: { concurrency: 3, retryTimes: 3 } }6.3 常见故障排查SQL不支持错误检查是否使用了分片不支持的语法如多子查询分片键为空确保插入操作包含分片键值性能下降检查是否出现跨分片查询我在生产环境总结的黄金法则先通过sql.showtrue查看实际路由情况再分析执行计划。90%的问题都能通过这个方法定位。7. 从SpringBoot2迁移到3的注意事项包路径变化javax.*→jakarta.*需要显式排除旧的javax.persistence依赖配置差异移除spring.main.allow-bean-definition-overridingtrue使用新的spring.sql.init替代旧的数据库初始化配置HikariCP配置spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000迁移过程中最大的坑是第三方库的兼容性。建议先建立一个分支进行充分测试我通常会用1-2周时间完成完整验证。

相关新闻

2026年中科AI能否精准实现风险预警?答案即将揭晓!

2026年中科AI能否精准实现风险预警?答案即将揭晓!

在当今竞争激烈的商业环境中,企业面临着各种各样的风险,如市场波动、政策变化、技术革新等。准确的风险预警能够帮助企业提前做好应对准备,降低损失。随着AI技术的飞速发展,越来越多的企业开始寄希望于AI来实现精准的风险预警。那…

2026/9/26 14:13:49 阅读更多 →
IO模型与并发服务器

IO模型与并发服务器

阻塞IO 用户层:char buf[1024];recv(fd, buf, sizeof(0), 0); //程序卡在这里等待数据内核:1.检查socket接收缓冲区是否有数据 2.若无数据: 将进程状态设为TASK_INTERRUPTIBLE(可中断睡眠) 进程从CPU运行队列移出,触发调度器切…

2026/9/28 14:48:05 阅读更多 →
C++实现通胀挂钩债券交换测试:量化金融建模与实战

C++实现通胀挂钩债券交换测试:量化金融建模与实战

1. 项目概述:从量化视角看债券交换最近在整理一些过往的量化策略研究笔记,翻到了一个挺有意思的实践项目:用C实现一个针对通胀挂钩债券(CPI-Linked Bond)的交换(Swap)测试实例。这个项目源于几年…

2026/10/6 14:54:34 阅读更多 →

最新新闻

DiffiT实战:用视觉Transformer替代U-Net的扩散模型训练与调优

DiffiT实战:用视觉Transformer替代U-Net的扩散模型训练与调优

简介:DiffiT是NVIDIA团队提出的一种将视觉变换器引入扩散模型的图像生成新架构,面向生成式AI研究者、计算机视觉方向学生及扩散模型开发者,用于解决传统去噪网络过度依赖卷积残差U-Net、注意力机制设计缺乏统一范式的问题。资源包内含1个PDF文…

2026/10/15 15:16:00 阅读更多 →
我是怎么让文章被AI频繁引用的:一套GEO实操流程

我是怎么让文章被AI频繁引用的:一套GEO实操流程

越来越多人不再打开搜索引擎,而是直接问AI。过去我们比排名,现在比的是有没有被AI引用。我用半年时间跑通了一套GEO实操流程,七个步骤压在一张表里,照着做就能上手。一、GEO实操流程把流程拆开是七步,压成一张表&#…

2026/10/15 15:16:00 阅读更多 →
Linux + Qt/QML:解决 QtQuick.VirtualKeyboard.Plugins 模块加载失败与环境变量配置

Linux + Qt/QML:解决 QtQuick.VirtualKeyboard.Plugins 模块加载失败与环境变量配置

一、配置环境变量1、方法1:于终端中配置环境变量在启动YourApp 之前,于当前终端中配置环境变量:export QTDIR~/Qt5.14.2/5.14.2/gcc_64 export PATH$QTDIR/bin:$PATH export LD_LIBRARY_PATH$QTDIR/lib:$LD_LIBRARY_PATH export QT_PLUGIN_PA…

2026/10/15 15:16:00 阅读更多 →
Epicor交易业务类型:ERP库存与成本流转的语义协议层

Epicor交易业务类型:ERP库存与成本流转的语义协议层

简介:本资源是一份面向Epicor ERP系统实施顾问、财务与供应链模块运维人员及二次开发工程师的实务参考文档,聚焦交易业务类型(Transaction Business Types)的完整定义与账务逻辑说明。文档系统梳理了Epicor中近30类核心交易类型&a…

2026/10/15 15:16:00 阅读更多 →
Piccolo 仓库 Dear ImGui 集成指南:example_sdl_opengl2 在 Windows / Linux / macOS 上的完整构建与原理剖析

Piccolo 仓库 Dear ImGui 集成指南:example_sdl_opengl2 在 Windows / Linux / macOS 上的完整构建与原理剖析

游戏开发图形学 【免费下载链接】Piccolo Piccolo (formerly Pilot) – mini game engine for games104 项目地址: https://gitcode.com/gh_mirrors/pi/Piccolo 点击查看 免费下载 本指南以 example_sdl_opengl2 的 README 为核心,系统讲解 Dear ImGui …

2026/10/15 15:16:00 阅读更多 →
一个人运营10个账号是什么体验?工具选对了真的不累

一个人运营10个账号是什么体验?工具选对了真的不累

朋友问我:一个人管10个账号,是不是天天熬夜?我认真算了算,真正忙的其实不是“写”,而是“发”和“复盘”。同一个动作重复十遍,才是把人拖垮的根源。今天不堆方法论,只讲真实体验,以…

2026/10/15 15:14:58 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →