ShardingSphere 和 Spring 的动态数据源切换机制的对比以及原理
ShardingSphere 与 Spring 动态数据源切换机制的对比及原理
一、核心定位对比
| 维度 | ShardingSphere | Spring动态数据源(如 AbstractRoutingDataSource) |
|---|---|---|
| 定位 | 分布式数据库中间件 | 轻量级多数据源路由工具 |
| 核心目标 | 分库分表、读写分离、分布式事务 | 多数据源动态切换 |
| 适用场景 | 大数据量、高并发、复杂分片需求 | 简单多数据源隔离(如多租户、环境隔离) |
| 实现层级 | JDBC 驱动层(拦截并改写 SQL) | 应用层(基于 Spring AOP 或手动切换) |
二、核心原理剖析
1. ShardingSphere 实现原理
关键特性:
- JDBC 驱动层拦截:通过自定义 JDBC 驱动拦截 SQL,实现透明化分片
- SQL 改写引擎:自动将逻辑表名改写为物理表名(如
user→user_001) - 分布式主键生成:内置 Snowflake 等算法生成全局唯一 ID
- 读写分离路由:自动区分读写操作,路由到主库或从库
2. Spring 动态数据源实现原理
关键特性:
- 数据源路由抽象:通过
determineCurrentLookupKey()动态决定数据源 - AOP 集成:通常结合
@DataSource注解和切面实现自动切换 - 简单配置:通过 Map 维护多个数据源
@Bean public DataSource dataSource() {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put("ds1", ds1());targetDataSources.put("ds2", ds2());AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource() {@Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.get();}};routingDataSource.setTargetDataSources(targetDataSources);return routingDataSource; }
三、核心功能对比
| 功能 | ShardingSphere | Spring动态数据源 |
|---|---|---|
| 分库分表 | ✅ 支持复杂分片策略(哈希、范围等) | ❌ 仅支持简单数据源切换 |
| SQL改写 | ✅ 自动改写逻辑表名为物理表名 | ❌ 不支持 |
| 读写分离 | ✅ 内置负载均衡策略 | ❌ 需自行实现 |
| 分布式事务 | ✅ 支持 XA/SAGA 等模式 | ❌ 依赖 Spring 事务管理器 |
| 跨库查询 | ✅ 自动合并多数据源结果 | ❌ 需手动处理 |
| 性能优化 | ✅ 并行执行、连接池复用 | ❌ 简单连接切换 |
四、技术实现差异
1. 路由触发机制
-
ShardingSphere:
// 通过 SQL 解析触发路由 String sql = "SELECT * FROM user WHERE user_id = 123"; ShardingRouter.route(sql); // 自动解析 user_id=123 → ds_1.user_003 -
Spring动态数据源:
// 需手动设置路由标识 DataSourceContextHolder.set("ds2"); jdbcTemplate.query(...); // 使用 ds2 执行 DataSourceContextHolder.clear();
2. 事务管理
-
ShardingSphere:
// 分布式事务管理 @ShardingTransactionType(TransactionType.XA) @Transactional public void crossDatabaseUpdate() {// 跨库操作... } -
Spring动态数据源:
@Transactional public void multiDataSourceOp() {// 需保证所有操作在同一数据源// 跨数据源操作会破坏事务一致性 }
五、选型建议
1. 使用 ShardingSphere 的场景
- 单表数据量超过 500 万行
- 需要自动化的分库分表、读写分离
- 涉及跨分片查询和事务
- 要求透明的 SQL 兼容性
2. 使用 Spring 动态数据源的场景
- 多租户数据隔离(每个租户独立数据库)
- 开发/测试环境动态切换数据源
- 简单的读写分离(主从架构)
- 轻量级多数据源需求(数据源数量 < 5)
六、混合架构示例
可将两者结合使用,实现多层数据路由:
配置示例:
// 第一层:Spring动态数据源(租户路由)
public class TenantRoutingDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return TenantContext.getCurrentTenant();}
}// 第二层:ShardingSphere数据源(分库分表)
@Bean
public DataSource shardingDataSourceA() {// 配置分片规则...return ShardingSphereDataSourceFactory.createDataSource(...);
}
七、性能对比
| 指标 | ShardingSphere | Spring动态数据源 |
|---|---|---|
| 简单查询延迟 | 10~15ms(含解析路由) | 2~5ms(直接路由) |
| 跨分片查询吞吐量 | 5000+ TPS(并行执行) | 不支持跨数据源查询 |
| 连接池管理 | 分片级独立连接池 | 全局统一连接池 |
| 高并发场景 | 优(异步执行+连接复用) | 良(依赖连接池配置) |
总结
- ShardingSphere 是面向分布式数据库的“重型武器”,适合复杂分片场景,但需要付出一定的学习成本。
- Spring动态数据源 是轻量级工具,适合简单多数据源需求,但功能有限。
- 两者可结合使用:用 Spring 做租户级路由,ShardingSphere 处理分库分表,形成多层数据路由架构。
相关文章:
ShardingSphere 和 Spring 的动态数据源切换机制的对比以及原理
ShardingSphere 与 Spring 动态数据源切换机制的对比及原理 一、核心定位对比 维度ShardingSphereSpring动态数据源(如 AbstractRoutingDataSource)定位分布式数据库中间件轻量级多数据源路由工具核心目标分库分表、读写分离、分布式事务多数据源动态切…...
基于Django的协同过滤算法养老新闻推荐系统的设计与实现
基于Django的协同过滤算法养老新闻推荐系统(可改成普通新闻推荐系统使用) 开发工具和实现技术 Pycharm,Python,Django框架,mysql8,navicat数据库管理工具,vue,spider爬虫࿰…...
AI视频生成工具清单(附网址与免费说明)
以下是一份详细的AI视频制作网站总结清单,包含免费/付费信息及核心功能说明: AI视频生成工具清单(附网址与免费说明) 1. Synthesia 网址:https://www.synthesia.io是否免费:免费试用(生成视频…...
JavaWeb学习——HTTP协议
HTTP 协议 什么是 HTTP 协议 HTTP(超文本传输协议,HyperText Transfer Protocol)是用于在客户端(如浏览器)和服务器之间传输超文本(如网页、图片、视频等)的应用层协议。它是现代互联网数据通…...
QP 问题(Quadratic Programming, 二次规划)
QP 问题(Quadratic Programming, 二次规划)是什么? QP(Quadratic Programming,二次规划)是一类优化问题,其中目标函数是二次型函数,约束条件可以是线性等式或不等式。 QP 问题是线…...
VSTO(C#)Excel开发2:Excel对象模型和基本操作
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
MySQL索引数据结构
目录 1 索引常用的数据结构 1.1 二叉树 1.2 平衡二叉树 1.3 红黑树 1.3 Hash表 1.4 B树 1.4 B树 2 MySQL索引的数据结构 2.1 MyISAM存储引擎索引 2.2 InnoDB存储引擎索引 2.2.1 聚集索引 2.2.2 非聚集索引 2.2.3 联合索引数 2.2.4 hash索引 1 索引常用的数据结构 1.1 二叉树 二…...
C 语 言 --- 数 组 (1)
C 语 言 --- 数 组1 数 组定义一维数组语 法 格 式初始化完 全 初 始 化不 完 全 初 始 化省 略 数 组 大 小不 初 始 化使 用 memset 初 始 化 类 型访 问 元 素一 维 数 组 在 内 存 中 的 存 储 总结 💻作 者 简 介:曾 与 你 一 样 迷 茫,…...
[视频编码]rkmpp 实现硬件编码
mpi_enc_test的命令参数描述说明 命令参数的描述说明如下: 命令参数 描述说明 -i 输入的图像文件。 -o 输出的码流文件。 -w 图像宽度,单位为像素。 -h 图像高度,单位为像素。 -hstride 垂直方向相邻两行之间的距离,单…...
3D数字化:家居行业转型升级的关键驱动力
在科技日新月异的今天,家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起,再到如今3D数字化营销的广泛应用,消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷,还…...
网安知识点
1.SQL注入漏洞产生的原因是? 前端传到后端的数据,没有经过任何处理,直接当作sql语句的一部分来执行 2.讲一下sql注入,写入webshell需要哪些前提条件 开启导入导出权限secure-file-priv 站点根目录位置/路径 mysql用户对站点根目…...
天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】
大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题,包含:• 社会偏见(Social Bias)LLM在生成文本时强化对特定社会群体的刻板印象,例如将穆斯林与恐怖主义关联,或…...
【kubernetes】service
目录 1. 说明2. 原理2.1 服务注册2.2 服务发现2.3 负载均衡 3. Service的类型3.1 ClusterIP3.2 NodePort3.3 LoadBalancer3.4 ExternalName 4. 使用场景 1. 说明 1.kubernetes中的service主要用于提供网络服务,并实现微服务架构中的几个核心功能:全自动…...
Python卷积神经网络(CNN)来识别和计数不同类型的工业零件
以下三种类型工业零件为例,使用卷积神经网络(CNN)来识别和计数不同类型的工业零件。以下是Python实现步骤: 数据准备:收集并标注包含不同形状(如方形、圆形、扇形)的工业零件图像数据集。 模型…...
MoonSharp 文档二
目录 6.Sharing objects 我们先来简单谈谈类型描述符 先说类型描述 稍微复杂一点 调用静态成员 应该使用 “:” 还是 “.” 重载 ByRef 参数(C# 中的 ref/out) 索引器 userdata 上的运算符和元方法 扩展方法 事件 关于 InteropAccessMode 的…...
android 支持自定义布局、线程安全、避免内存泄漏的 Toast 工具类
支持自定义布局:可以灵活地显示自定义样式的 Toast。 线程安全:确保在主线程中显示 Toast,避免崩溃。 避免内存泄漏:使用 ApplicationContext 和取消机制,防止内存泄漏问题。 工具类:作为一个通用的工具…...
景联文科技:以精准数据标注赋能AI进化,构筑智能时代数据基石
在人工智能技术席卷全球的浪潮中,高质量数据已成为驱动AI模型进化的核心燃料。作为全球领先的AI数据服务解决方案提供商,景联文科技深耕数据标注领域多年,以技术为基、以专业为本,致力于为全球客户提供全场景、高精度、多模态的数…...
Mysql的卸载安装配置以及简单使用
MySQL其它问题已经更新在:MySQL完善配置---可视化-CSDN博客 一、卸载 ①控制面板卸载 ②C盘隐藏项目>ProgramData>mysql相关文件夹,还有Program file下的MySQL文件夹 ③开始菜单栏搜索>服务,找到MySQL相关服务删除,如果再…...
使用 ResponseBodyEmitter 实现异步响应式数据流处理
1. 概述 1.1 什么是 ResponseBodyEmitter ResponseBodyEmitter 是 Spring MVC 提供的一个接口,用于支持异步返回响应数据流。它允许在控制器方法中逐步发送数据给客户端,而无需一次性生成完整的响应。 1.2 使用场景 实时数据推送(如股票行情、聊天消息等)。大量数据分批…...
Uniapp项目运行到微信小程序、H5、APP等多个平台教程
摘要:Uniapp作为一款基于Vue.js的跨平台开发框架,支持“一次开发,多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台,并解析常见问题。 一、环境准备 在开始前,请确保已安装以下工具…...
Mali GPU着色器优化与性能分析实战
1. Mali离线着色编译器深度解析Mali离线着色编译器是Arm为开发者提供的专业工具链组件,专门用于分析和优化面向Mali GPU架构的着色器代码。与运行时编译不同,它允许开发者在构建阶段就对着色器性能进行静态分析和调优。1.1 核心工作原理该工具通过模拟Ma…...
iPhone、iPad、Mac功能联动!
今天分享几个iPhone、iPad、Mac之间的联动技巧 通讯转接 iPhone不在身边或者不方便拿出来接听电话,在身边的iPad、Mac也可以接听电话,设置方法如下: 打开设置 – 电话 – 在其他设备上通话 – 勾选上iPad、Mac设备就可以了,iPh…...
RocketMQ Dashboard 部署实战:从源码到生产可用的控制台
1. RocketMQ Dashboard 是什么? RocketMQ Dashboard 是 Apache RocketMQ 官方提供的可视化监控管理工具,相当于给 RocketMQ 装上了"仪表盘"。想象一下开车没有仪表盘,不知道油量、车速、发动机状态有多可怕?RocketMQ Da…...
重塑高效办公新范式:2026年办公轻薄笔记本推荐榜单
在混合办公与远程协作成为职场常态的2026年,一台称职的办公笔记本电脑早已不再是简单的文档处理工具。它需要胜任的角色愈发多元:清晨的视频会议中,它要保证画质清晰、语音通透;午后的数据分析时,它要能流畅运行大型Ex…...
基于BLE与NeoPixel的智能眼镜控制:在ATtiny85上实现无线光效交互
1. 项目概述与核心价值几年前,当我第一次把玩Adafruit的NeoPixel灯环时,就被其绚丽的色彩和简单的控制方式所吸引。后来,一个很自然的想法冒了出来:能不能把这些灯珠集成到一副眼镜上,并且用手机来无线控制它ÿ…...
轻量级网络监控工具nmer:配置即代码的探测与响应实践
1. 项目概述:一个轻量级网络监控与响应工具最近在梳理内部网络监控体系时,我重新审视了一个老伙计——psterman/nmer。这可不是什么新潮的框架,但在特定场景下,它的简洁和高效总能让人眼前一亮。简单来说,nmer是一个用…...
树莓派网络配置全攻略:从有线到无线,新手到进阶
1. 项目概述:为什么网络配置是树莓派的第一课刚拿到一块崭新的树莓派,看着它小巧的主板和闪烁的指示灯,你脑子里想的可能是立刻跑个酷炫的Python项目,或者搭建一个家庭媒体中心。但别急,在这一切开始之前,有…...
保姆级教程:用Docker部署Jenkins时,如何搞定Agent节点的50000端口映射(附避坑点)
深度解析Docker化Jenkins部署:50000端口映射全攻略与实战避坑指南 Jenkins作为持续集成领域的标杆工具,其容器化部署已成为现代DevOps实践的标配。但当Master节点运行在Docker环境中时,Agent节点连接失败的场景屡见不鲜——其中80%的问题根源…...
Midjourney批量生成工作流终极提速方案:从单图2分钟到百图并发17秒,实测数据驱动的6大优化节点
更多请点击: https://intelliparadigm.com 第一章:Midjourney批量生成工作流的性能瓶颈全景图 在高并发图像生成场景中,Midjourney 的批量工作流常因 API 限流、提示词解析延迟、队列堆积及资源调度失衡而显著降速。其底层依赖 Discord 消息…...
LinkSwift:九大网盘直链下载助手的终极技术解析与实践指南
LinkSwift:九大网盘直链下载助手的终极技术解析与实践指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...
