Java在数据库分库分表中间件(ShardingSphere)中的设计

简介: 单表数据量超过千万级后,查询性能下降;单库连接数有限。分库分表将数据水平拆分到多个数据库和表中。https://ylswkj.com业务代码需要知道具体访问哪个库哪个表,侵入性强。

1.分库分表的需求背景
单表数据量超过千万级后,查询性能下降;单库连接数有限。分库分表将数据水平拆分到多个数据库和表中。但业务代码需要知道具体访问哪个库哪个表,侵入性强。ShardingSphere是一套开源的分布式数据库中间件,完全由Java实现,通过拦截JDBC层SQL,自动路由到目标数据源。
参考:https://www.xrzqr.cn/category/city-forecast.html

2.ShardingSphere-JDBC的工作原理
它以JAR包形式集成在应用内,重写DataSource接口,解析SQL中的分片键(如order_id),根据分片算法(如order_id%4)计算出目标库和表,再改写SQL(如添加表别名、调整范围查询),最后执行并聚合结果。对业务代码透明,只需修改DataSource配置。

3.分片策略与分布式事务
分片键:通常选择查询频率高的字段(如user_id、order_id)。
分片算法:取模、哈希、范围、复合分片。
分布式事务:ShardingSphere支持XA(Atomikos)和柔性事务(SEATA),保证跨库操作的ACID。

4.读写分离与影子库
ShardingSphere也支持主从读写分离:写SQL走主库,读SQL走从库,并内置负载均衡。影子库(ShadowDB)用于压测流量路由,不影响生产数据。
参考:https://www.xrzqr.cn/category/national-weather.html

5.案例:电商订单表的分库分表
某电商订单系统,订单表每天新增200万行。计划分16个库,每个库64张表(共1024张表)。分片键为order_id(雪花算法生成,包含时间戳)。使用ShardingSphere-JDBC配置:
default-database-strategy:order_id%16确定数据库。
table-strategy:order_id%64确定表。
对于查询用户订单(需user_id分片),使用复合分片,同时支持order_id和user_id,避免全路由。
上线后,单条查询平均耗时<2ms,范围查询通过IN拆解为多个单分片查询,性能提升10倍。

6.SQL限制与注意事项
不支持跨库JOIN(除非绑定表,即相同分片键)。
ORDERBY、GROUPBY会收集所有分片结果再聚合,大量数据时性能差。
不支持INSERTINTO...SELECT等复杂语句。
分布式序列(雪花算法)内置支持。

7.与MyCAT、Vitess对比
MyCAT:独立代理,性能有损耗,但跨语言。
Vitess:基于MySQL协议代理,功能强大,但部署复杂。
ShardingSphere-JDBC:无代理,性能好,适合Java技术栈。

8.总结
ShardingSphere是Java生态中分库分表的首选方案。它在JDBC层透明地解决了水平扩展问题,让开发者可以继续使用熟悉的JPA或MyBatis操作多数据源。对于数据量持续增长的应用,这是必备的中间件。
参考:https://www.xrzqr.cn

目录
相关文章
|
21小时前
|
人工智能 数据可视化 5G
一线互联 × Rokid AI眼镜:为什么它是工业4.0时代一线人员的标准装备?
Gartner预测:2027年30%工业企业将为一线员工标配AI眼镜(2023年仅5%)。Rokid灵伴眼镜+一线互联jLink,以轻量化硬件、5G低延时网络与任务驱动型协作系统,实现远程指导、过程留痕、数据归档闭环,助力企业降本增效、沉淀数字资产。(239字)
24 0
|
21小时前
|
人工智能 前端开发 Java
AI 写的动画太丑了?这个 GitHub 项目专治"AI 味"界面
Cursor写前端很爽,但动画总千篇一律?「awesome-motion.md」提供12种专业动效规范(如Apple Fluid、GSAP Cinematic),只需将对应`MOTION.md`放入项目根目录,AI即按精确数值(贝塞尔曲线、时长、反馈细节等)生成风格统一、体验出众的动画——让动效设计从“说不清”变成“复制即用”。
22 0
|
22小时前
|
机器学习/深度学习 人工智能 搜索推荐
书尖AI携手阿里云云端算力,打造智能阅读与轻量化学习新体验
书尖AI是基于阿里云算力的智能阅读工具,内嵌自研大模型,聚合亿万册正版资源。支持AI精读(3分钟提炼全书精华)、双人互动播客、个性化创作与智能语音生成,兼顾碎片听学与深度学习,操作简便、安全稳定。(239字)
|
21小时前
|
消息中间件 缓存 监控
系统负载高一定是CPU问题吗?
Load Average飙升≠CPU过载!它反映的是运行/等待进程数,可能因磁盘IO、网络延迟、锁竞争或异常进程导致。CPU空闲而负载高,常见于磁盘await高、util近100%,或大量D状态进程。排查应先看top、iostat、ss、ps,定位真因而非盲目扩容。
|
22小时前
|
XML SQL 人工智能
写什么CRUD?需求一句话,工程代码全自动生成
GitHub Copilot按Token计费致成本飙升,通用AI因缺乏业务上下文,生成CRUD效率低、返工多。智能引导(需求→接口→表结构→逻辑→源码),每步可干预,自动生成规范工程代码、测试与文档,让工程师专注“指挥AI写对CRUD”。
|
22小时前
|
JSON 测试技术 API
爆肝3周,开源一套通用测试Skills框架:支持Web/App/接口统一技能调用
本文介绍一款通用测试Skills框架,通过“Skill抽象+注册中心+动态调度”三层设计,实现Web/App/接口三端技能统一调用。告别重复编码与工具绑定,一套YAML用例驱动多端执行,大幅提升资产复用率与团队协作效率。
|
21小时前
|
消息中间件 运维 Java
Java在分布式配置热更新中的设计(长轮询与Watch机制)
在微服务运行时,动态修改配置(如日志级别、限流阈值、功能开关)而不重启服务,对运维效率至关重要。实现热更新的常见模式有:定时拉取、参考:https://sxjfpfb.com长轮询、Watch(监听)机制。Java生态中,Nacos、Apollo、Consul都提供了SDK。
24 0
|
21小时前
|
中间件 API PHP
PHP在数据脱敏与隐私保护中间件中的实践
随着《个人信息保护法》、GDPR等法规的实施,企业需要对用户敏感信息(手机号、身份证、银行卡号、邮箱)进行脱敏处理。通常场景https://iwanttofly.cn包括:API返回给前端的日志中不能包含明文敏感数据;数据库查询时的动态脱敏;导出文件时的自动遮盖。
18 0
|
21小时前
|
编解码 Java PHP
PHP、Java、C++在音视频处理转码系统中的协作
音视频转码(如将AVI转为MP4,调整分辨率、码率)计算密集,耗时长。一个完整的转码系统通常包含:https://bjshihong.com任务管理(用户提交、优先级、状态跟踪)
39 1
|
21小时前
|
消息中间件 C++ 计算机视觉
C++在进程间通信(共享内存与消息队列)中的高性能实践
多进程架构中,进程间需要交换数据。相比网络socket,共享内存提供了最低延迟的通信方式(纳秒级),https://empirechem.cn适合高频数据交换场景(如实时行情分发、图像处理流水线)
29 0