当前位置: 首页 > article >正文

《ShardingSphere解读》03 JDBC 规范与 ShardingSphere 是什么关系?

在上一篇中我们全面了解了 ShardingSphere 作为 Apache 顶级开源软件的发展历程、设计理念和核心功能。其中特别强调了一点ShardingSphere 是一种典型的客户端分片解决方案而客户端分片的核心实现方式之一就是重写 JDBC 规范。ShardingSphere 对外暴露的分片操作接口与 JDBC 规范中所提供的接口完全一致这究竟是如何实现的本课时将深入剖析 JDBC 规范与 ShardingSphere 的这层关系从底层设计上解开其中的奥秘。一、JDBC 规范简介JDBCJava Database Connectivity是 Java 领域访问数据库的标准规范。它定义了一套统一的接口让应用程序可以通过一致的方式操作不同数据库。数据库厂商则提供这些接口的实现即数据库驱动从而将具体数据库的差异屏蔽在驱动层之下。1.1 JDBC 架构JDBC 的核心架构如下图所示它由 DriverManager、Driver、Connection 等核心组件构成DriverManager负责加载和管理不同数据库的驱动程序并根据连接 URL 返回对应的 Connection 对象。Driver数据库驱动程序由数据库厂商实现负责与数据库建立底层通信。Connection代表与数据库的会话连接是执行 SQL 的上下文。Statement / PreparedStatement用于执行静态 SQL 或预编译 SQL。ResultSet封装 SQL 查询的结果集。1.2 JDBC 核心接口及典型使用流程在 JDBC 规范中DataSource、Connection、Statement、ResultSet是最核心的接口。下面通过一段典型代码展示它们的使用方式// 创建池化的数据源 PooledDataSource dataSource new PooledDataSource(); dataSource.setDriver(com.mysql.jdbc.Driver); dataSource.setUrl(jdbc:mysql://localhost:3306/test); dataSource.setUsername(root); dataSource.setPassword(root); // 获取连接 Connection connection dataSource.getConnection(); // 创建语句并执行查询 PreparedStatement statement connection.prepareStatement(SELECT * FROM user); ResultSet resultSet statement.executeQuery(); // 遍历结果集 while (resultSet.next()) { // 处理每一行数据 } // 关闭资源 resultSet.close(); statement.close(); connection.close();上述流程可以用下图概括1.3 各核心接口详解1.3.1 DataSourceDataSource是 JDBC 2.0 引入的接口它作为连接工厂提供了比DriverManager更强大的功能例如连接池、分布式事务等。其定义如下public interface DataSource extends CommonDataSource, Wrapper { Connection getConnection() throws SQLException; Connection getConnection(String username, String password) throws SQLException; }CommonDataSource是DataSource、ConnectionPoolDataSource和XADataSource的父接口后两者分别用于连接池和分布式事务场景。它们的关系如下注意DataSource还继承了Wrapper接口。Wrapper是 JDBC 4.0 引入的用于让应用程序访问非 JDBC 标准的扩展功能。通过unwrap方法可以将 JDBC 包装对象还原为原生对象通过isWrapperFor可以判断是否可包装为指定类型。这个接口为 ShardingSphere 重写 JDBC 规范提供了基础。1.3.2 ConnectionConnection代表与数据库的会话连接它负责创建Statement或PreparedStatement并管理事务提交、回滚、设置隔离级别等。在分片场景下Connection需要能够路由到多个物理数据库因此 ShardingSphere 实现了ShardingConnection。1.3.3 Statement 与 PreparedStatementStatement用于执行静态 SQL而PreparedStatement继承自Statement支持预编译 SQL可防止 SQL 注入并提升执行效率。ShardingSphere 分别提供了ShardingStatement和ShardingPreparedStatement它们在内部将逻辑 SQL 改写为真实 SQL并路由到对应分片执行。1.3.4 ResultSetResultSet封装查询结果提供遍历和获取数据的方法。分片查询可能涉及多个数据源返回的多个结果集ShardingSphere 的ShardingResultSet负责对这些结果集进行归并对外呈现为单个逻辑结果集。二、基于适配器模式的 JDBC 重写实现方案ShardingSphere 要实现与 JDBC 规范完全兼容的 API必须对DataSource、Connection、Statement、ResultSet等核心接口进行重写使其在内部嵌入分片逻辑但对外依然呈现为标准接口。这一重写机制的设计核心是适配器模式Adapter Pattern。2.1 适配器模式概述适配器模式用于将一个类的接口转换成客户希望的另一个接口使得原本因接口不兼容而无法一起工作的类可以协同工作。在 ShardingSphere 中它扮演的角色是目标接口TargetJDBC 规范中的标准接口如DataSource、Connection。被适配者AdapteeShardingSphere 内部实现分片逻辑的类如ShardingDataSource。适配器Adapter连接目标接口和被适配者的中间层使得最终对象既符合 JDBC 规范又具备分片能力。2.2 ShardingSphere 适配器体系总体结构ShardingSphere 为每个核心接口设计了一套适配器类其总体结构如下图中各层次的含义WrapperJDBC 标准接口所有核心接口都继承它。WrapperAdapterShardingSphere 提供的包装器适配基类实现了recordMethodInvocation和replayMethodsInvocation方法用于记录和重放对底层真实连接的方法调用后面详述。AbstractUnsupportedOperationJdbcObject抽象类将所有 JDBC 中不打算支持的方法直接抛出异常明确职责边界。例如prepareCall存储过程调用在分片场景中通常不支持就在这里抛出SQLFeatureNotSupportedException。AbstractJdbcObjectAdapter抽象类继承自AbstractUnsupportedOperationJdbcObject提供部分方法的默认实现这些方法是 ShardingSphere 需要增强的如prepareStatement。真正的分片逻辑尚未加入留给子类实现。ShardingJdbcObject具体类如ShardingDataSource、ShardingConnection、ShardingStatement它们实现分片逻辑并对外呈现为标准 JDBC 接口。这种分层设计将“不支持的方法”、“需增强的方法”和“具体分片逻辑”清晰地分离既保证了与 JDBC 规范的兼容又使代码易于维护和扩展。2.3 包结构组织在 ShardingSphere 源码的sharding-jdbc-core模块中适配器相关的类位于org.apache.shardingsphere.shardingjdbc.jdbc.adapter包下结构如下org.apache.shardingsphere.shardingjdbc.jdbc.adapter ├── AbstractDataSourceAdapter ├── AbstractConnectionAdapter ├── AbstractStatementAdapter ├── AbstractPreparedStatementAdapter ├── AbstractResultSetAdapter ├── WrapperAdapter └── ... (各子类的实现)这种按职责划分的包结构使得开发者可以快速定位需要扩展的类。三、ShardingSphere 重写 JDBC 规范示例ShardingConnection下面以ShardingConnection为例深入分析其如何通过适配器模式实现对 JDBCConnection接口的重写。3.1 ShardingConnection 的类层结构ShardingConnection的继承体系完全遵循前面介绍的适配器模式AbstractUnsupportedOperationConnection继承WrapperAdapter实现了Connection接口中所有不支持的方法如prepareCall直接抛出异常。这确保ShardingConnection只关注支持的方法。AbstractConnectionAdapter继承AbstractUnsupportedOperationConnection提供了连接缓存、获取物理连接等通用能力但createConnection方法留为抽象由子类实现。ShardingConnection继承AbstractConnectionAdapter实现createConnection方法根据分片规则返回实际的数据库连接并重写prepareStatement等方法嵌入分片逻辑。3.2 连接缓存与获取AbstractConnectionAdapterAbstractConnectionAdapter中维护了一个cachedConnections属性它是一个Map键为数据源名称值为该数据源对应的物理连接集合。这样在同一个逻辑连接生命周期内对同一数据源的多次操作可以复用已创建的连接避免重复创建。核心方法getConnections负责从缓存中获取连接若不足则创建新的连接。其简化流程如下public final ListConnection getConnections(ConnectionMode connectionMode, String dataSourceName, int connectionSize) throws SQLException { // 1. 从缓存中获取已有连接 CollectionConnection connections cachedConnections.get(dataSourceName); // 2. 如果缓存中连接数足够直接返回子列表 if (connections.size() connectionSize) { return new ArrayList(connections).subList(0, connectionSize); } // 3. 否则创建不足数量的新连接 ListConnection newConnections createConnections(dataSourceName, connectionMode, dataSource, connectionSize - connections.size()); // 4. 将新连接加入缓存并返回 synchronized (cachedConnections) { cachedConnections.putAll(dataSourceName, newConnections); } // ... 合并已有连接和新连接返回 }创建连接最终调用抽象方法createConnectionprotected abstract Connection createConnection(String dataSourceName, DataSource dataSource) throws SQLException;ShardingConnection会实现该方法从数据源中获取真正的物理连接。3.3 方法记录与重放WrapperAdapter在AbstractConnectionAdapter的getConnections方法中创建新连接后会调用replayMethodsInvocation(connection)。这个方法是定义在WrapperAdapter中的其作用是将之前对逻辑连接执行的一些配置方法如setAutoCommit、setReadOnly“重放”到新创建的物理连接上确保物理连接的状态与逻辑连接一致。WrapperAdapter中维护了一个jdbcMethodInvocations列表用于记录需要重放的方法调用public final void recordMethodInvocation(Class? targetClass, String methodName, Class?[] argumentTypes, Object[] arguments) { jdbcMethodInvocations.add(new JdbcMethodInvocation(targetClass.getMethod(methodName, argumentTypes), arguments)); } public final void replayMethodsInvocation(Object target) { for (JdbcMethodInvocation each : jdbcMethodInvocations) { each.invoke(target); } }JdbcMethodInvocation是一个简单的包装类内部通过反射执行方法public class JdbcMethodInvocation { private final Method method; private final Object[] arguments; public void invoke(Object target) { method.invoke(target, arguments); } }那么何时记录方法调用在AbstractConnectionAdapter中对setAutoCommit、setReadOnly、setTransactionIsolation这三个方法进行了记录。以setReadOnly为例Override public final void setReadOnly(boolean readOnly) throws SQLException { this.readOnly readOnly; // 记录方法调用 recordMethodInvocation(Connection.class, setReadOnly, new Class[]{boolean.class}, new Object[]{readOnly}); // 对现有所有物理连接立即执行该操作 forceExecuteTemplate.execute(cachedConnections.values(), new ForceExecuteCallbackConnection() { Override public void execute(Connection connection) throws SQLException { connection.setReadOnly(readOnly); } }); }这里既记录了调用也立即对已有连接执行了操作。当后续新连接加入时通过replayMethodsInvocation将这些调用在新连接上重放保证所有物理连接的状态与逻辑连接一致。3.4 不支持的方法处理AbstractUnsupportedOperationConnection在AbstractUnsupportedOperationConnection中所有不打算支持的方法都直接抛出SQLFeatureNotSupportedException例如Override public final CallableStatement prepareCall(String sql) throws SQLException { throw new SQLFeatureNotSupportedException(prepareCall); }这样任何试图调用这些方法的代码都会得到明确的异常提示符合 JDBC 规范中对不支持操作的要求。四、其他核心类的适配实现除了ShardingConnectionShardingSphere 对DataSource、Statement、PreparedStatement、ResultSet也采用了完全相同的适配模式ShardingDataSource继承AbstractDataSourceAdapter实现getConnection返回ShardingConnection。ShardingStatement继承AbstractStatementAdapter重写executeQuery、executeUpdate等方法将逻辑 SQL 路由到真实数据库执行。ShardingPreparedStatement继承AbstractPreparedStatementAdapter处理参数化 SQL并在执行时替换参数值。ShardingResultSet继承AbstractResultSetAdapter归并多个物理结果集对外呈现为单个结果集。它们的继承体系与ShardingConnection类似都遵循WrapperAdapter→AbstractUnsupportedOperationXxx→AbstractXxxAdapter→ShardingXxx的层次结构。五、小结本篇深入剖析了 ShardingSphere 如何通过适配器模式实现对 JDBC 规范的重写使其对外提供完全兼容的 API内部却嵌入了强大的分片功能。我们首先回顾了 JDBC 规范的核心接口及其典型使用流程然后详细介绍了 ShardingSphere 基于适配器模式的整体设计最后以ShardingConnection为例分析了连接缓存、方法记录与重放、不支持方法处理等关键实现细节。这种设计带来的好处显而易见对开发者友好只需掌握标准 JDBC 编程即可使用分片功能。与现有框架无缝集成可轻松与 MyBatis、Hibernate、Spring 等生态结合。高可扩展性适配器模式将不支持的接口统一抛出异常支持的接口通过抽象类预留扩展点新增功能只需添加新的子类。理解这一底层机制是正确使用和扩展 ShardingSphere 的基础。思考题在WrapperAdapter中recordMethodInvocation记录了哪些方法为什么只记录这三个setAutoCommit、setReadOnly、setTransactionIsolation请结合 JDBC 规范和你对 ShardingSphere 的理解谈谈你的看法。欢迎在评论区留言讨论。

相关文章:

《ShardingSphere解读》03 JDBC 规范与 ShardingSphere 是什么关系?

在上一篇中,我们全面了解了 ShardingSphere 作为 Apache 顶级开源软件的发展历程、设计理念和核心功能。其中特别强调了一点:ShardingSphere 是一种典型的客户端分片解决方案,而客户端分片的核心实现方式之一就是重写 JDBC 规范。ShardingSph…...

【GitHub开源项目】一文学会Git提交本地代码到GitCode远程代码仓库)

摘要 本文详细讲解如何将本地代码提交到GitCode远程仓库的全流程。内容涵盖Git基础概念、安装配置、本地仓库初始化、提交规范、远程连接、分支管理与合并策略,以及常见问题解决方案。 目录 Git基础介绍与安装配置本地仓库初始化与文件添加提交更改与提交信息规范…...

智慧矿井监测数据集 矿车载人状态检测 矿车数据集 矿山井下作业安全监测、违规载人行为自动识别、智能视频监控预警第10563期

计算机视觉数据集数据集概览 本数据集聚焦矿山井下场景,针对矿车载人状态检测设计,适用于目标检测类深度学习模型训练与验证。项目内容类别数量2类类别中文名称正常情况、载人图像数量900张数据集格式YOLO格式核心应用价值矿山井下作业安全监测、违规载人…...

00后天才少女创业,Axiom获2亿美元A轮融资冲击AI上限

2亿美元A轮融资,Axiom估值飙升至16亿美元 近日,洪乐潼创立的AI初创公司Axiom完成了2亿美元的A轮融资,由Menlo Ventures领投,Greycroft、Madrona Venture、B Capital、Toyota Ventures等老股东继续追加投资。至此,公司估…...

马斯克 xAI 人事动荡,项目困境何解?

近日,马斯克的 AI 创业公司 xAI 人事变动剧烈,3 年前 11 名联合创始人仅 2 人在职。同时,其 AI 智能体项目“巨硬”困境重重,产品未达承诺。人事变动:华人联合创始人全离职3 年前 xAI 的 11 名联合创始人,如…...

Violoop:AI Agent 领域的破局者?

3 月 12 日,Violoop 宣布完成数千万元种子轮和天使轮融资。这家专注 AI PC 自动化硬件的中国创业公司,以独特路径探索 AI Agent 落地,有望打破行业格局。融资助力发展Violoop 完成两轮融资,资金将用于产品量产、市场推广和数据集构…...

AI 浪潮下软件行业的变革与重塑

AI 赋能:软件开发进入新时代两名 19 岁高中生凭借 AI 卡路里追踪应用 Cal AI 年收入超 3000 万美元,AI 编程公司 Cursor 年化收入超 20 亿美元,这些案例彰显了 AI 在软件领域的巨大潜力。Cursor 公司内部超三分之一的代码由 AI 完全自主完成&…...

三月估值翻四倍,Kimi改写AI叙事?

投资界消息,月之暗面Kimi正以180亿美元投前估值进行10亿美元融资。不到三个月,其估值翻四倍,成中国最快“十角兽”,业务端也迎来爆发。融资速度惊人去年底Kimi完成5亿美元C轮融资,投后估值43亿美元。春节期间超7亿美元…...

个人微信接入龙虾全攻略:官方合规直连,模型运行清晰,新手零门槛上手

个人微信接入龙虾全攻略:官方合规直连,模型运行清晰,新手零门槛上手 近期微信官方开放合规通道,个人微信终于能直接接入OpenClaw(俗称“龙虾”),不用再碰违规插件、不用担心里程碑封号风险&…...

抽象、建模与系统化:人类文明进步的通用算法

在人类漫长的历史中,从钻木取火到登月探索,从结绳记事到大语言模型,每一次重大突破似乎都源于某种深层的认知机制。这种机制并非神秘天赋,而是一种可被识别、学习和复用的方法论。本文将深入探讨这一方法论的核心三要素&#xff1…...

一语一世界:从平凡句子到人工智能的奇妙旅程

在人类文明的长河中,最震撼的突破往往源于对最平凡事物的深刻洞察。铀矿石不过是地壳中一种普通的矿物,却因人类对其原子结构的探索,最终释放出足以改变世界的能量;而书页上一句再普通不过的话——“今天天气很好”——竟也能成为…...

实用C盘清理图文教程(2026最新版):安全有效C盘清理清理方法,远离C盘爆红,清理C盘不误删文件

C盘爆满怎么办?2026年有效的C盘清理方法,让你的电脑快速释放几十个G! 如何清理Win系统下的C盘?C盘爆红怎么处理?有什么好用的C盘清理工具? 关于C盘清理工具,给大家安排一款针对C盘爆满的清理神…...

C盘清理,C盘变红解决方法最全指南(2026最新版),轻松解决C盘爆满问题,c盘怎么清理垃圾而不误删文件

我们使用电脑发现 C盘空间不足 时,第一反应只是“磁盘快满了”,但实际上: Windows 系统缓存、更新残留会在 C盘长期累积 C盘满了会 明显拖慢开机速度和软件响应 软件默认安装在 C盘,空间不足容易导致 程序闪退、更新失败 部分系统…...

三菱 FX2N PLC 控制步进电机:探索自动化控制之路

No.130 三菱 FX2N PLC控制步进电机在自动化控制领域,步进电机凭借其精确的位置控制和良好的调速性能,应用极为广泛。而三菱 FX2N PLC 作为一款经典的可编程逻辑控制器,在与步进电机配合实现精确控制方面有着出色的表现。今天咱们就来聊聊如何…...

打造 Spring Boot + Vue 的库存管理系统:技术融合与实践

基于springbootvue库存管理系统springbootvuemybatismysqlspringboot在当今数字化浪潮下,构建高效的库存管理系统对于企业运营至关重要。本文将带大家走进基于 Spring Boot Vue 技术栈,搭配 MyBatis 和 MySQL 的库存管理系统开发之旅。 Spring Boot&…...

生成式深度学习(四)

原文:Generative Deep Learning 译者:飞龙 协议:CC BY-NC-SA 4.0 第十四章:结论 2018 年 5 月,我开始着手第一版这本书的工作。五年后,我对生成 AI 的无限可能性和潜在影响感到比以往任何时候都更加兴奋。…...

PyTorch DDP分布式训练超快

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PyTorch DDP分布式训练:实现超快训练的深度解析目录PyTorch DDP分布式训练:实现超快训练的深度解析 引言…...

工厂的历史演进:从工业革命到智能时代

工厂的历史演进:从工业革命到智能时代摘要工厂作为现代工业社会的核心组织形式,其发展历程深刻反映了人类生产方式、社会结构和文明形态的变革。本报告通过系统梳理工厂从18世纪工业革命起源到21世纪智能时代的发展脉络,全面分析了工厂制度的…...

计算机毕业设计 | SpringBoot小米商城 购物管理系统(附源码)

1,绪论 1.1 背景调研 电子商城的建设,不仅仅是初级网上购物的实现,它能够有效地在Internet上构架安全的和易于扩展的业务框架体系,实现BToB(企业对企业)、BToC(企业对用户)以及CTo…...

OpenClawd的一个神器技能Skill Creator

这家伙,甚至可以说是整个Skills生态的基石。 Skill-creator 如今,小龙虾之所以能拥有如此出众的能力,在同类事物中脱颖而出,其中一半的功劳都要归功于各类实用的Skill。这些Skill涵盖了不同场景下的需求,能够精准赋能小龙虾,让它在使用过程中更高效、更便捷,而这些多样…...

PAT 乙级 1093

依旧简单的一集。字符也可以当成 int 型整数来用。 #include<bits/stdc.h> using namespace std;int main() {string a, b;getline(cin, a);getline(cin, b);string s a b;int v[150] {0};for(int i 0; i < s.size(); i ) {if(v[s[i]] 0)cout << s[i];v[s[…...

PowerShell 执行策略限制导致的 `npm` 命令无法运行的安全错误

PowerShell 执行策略限制导致的 npm 命令无法运行的安全错误 npm install npm : 无法加载文件 D:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution…...

动态残差组改进YOLOv26双重注意力机制与残差学习深度融合

动态残差组改进YOLOv26双重注意力机制与残差学习深度融合 在目标检测领域&#xff0c;特征提取的质量直接决定了模型的检测性能。传统的残差网络虽然能够有效缓解梯度消失问题&#xff0c;但在复杂场景下往往难以自适应地关注关键特征。本文介绍一种基于动态残差组&#xff08…...

有什么找工作比较好的软件?2026实测推荐,行业TOP1太省心

有什么找工作比较好的软件&#xff1f;2026实测推荐&#xff0c;行业TOP1太省心在求职市场竞争日趋激烈的当下&#xff0c;“有什么找工作比较好的软件”成为全网高频热搜&#xff0c;无论是应届生首次求职、职场人跳槽转型&#xff0c;还是蓝领群体寻求稳定岗位&#xff0c;一…...

香港启世集团宣布启动核聚变能源研究计划

创始人夙昊玄&#xff1a;推动人类迈向清洁能源新时代 香港&#xff0c;2026年3月 —— 香港启世集团今日宣布正式启动核聚变能源研究计划&#xff0c;致力于探索未来清洁能源解决方案。集团创始人 夙昊玄 表示&#xff0c;核聚变被视为人类能源发展的终极方向之一&#xff0c…...

告别“积木式”构建:RH Claw 实现 OpenClaw AIGC全模态能力一令直达

在2026年数字员工浪潮的推动下&#xff0c;开源框架OpenClaw&#xff08;小龙虾&#xff09;已进化为构建Agent的核心底层。而智能体进化的下一步&#xff0c;必然是执行力的全维度突破。因此&#xff0c;卓越的AIGC图形音视频工作流开发和API服务平台RunningHub正式发布RHClaw…...

全球医疗器械展会代理地域适配指南:各区域优质服务商精准推荐

一、引言与地域类参展核心痛点据国际展览业协会(UFI)最新数据显示,全球展览市场规模已突破3000亿美元,其中海外医疗器械展会年增速保持在8%以上,北京嘉宇沃德展览有限公司凭借深耕垂直领域、全区域布局、专业服务积淀,成为众多医疗企业出海参展、覆盖全球多区域展会的重要合作伙…...

API接口管理系统助力企业破解数据孤岛难题

当处于数字化转型那如浪潮般势头下时&#xff0c;企业的IT架构变得一天比一天愈加复杂&#xff0c;其内部常常运行着数十个&#xff0c;甚至多达上百个&#xff0c;是源自不同厂商&#xff0c;且处于不同时期建设而成的业务系统。这些数量众多的系统之间出现的数据孤岛情况&…...

超强AI智能抠图神器 Aiarty Image Matting 实操教程(0基础入门,发丝级抠图秒出效果)

在设计创作、办公排版、电商运营、短视频制作等场景中&#xff0c;抠图是高频且繁琐的操作。传统抠图工具不仅需要专业技巧&#xff0c;面对毛发、透明物体、复杂背景等场景时&#xff0c;更是耗时费力&#xff0c;往往出现抠图不精准、边缘生硬、细节丢失等问题&#xff0c;让…...

Spring AI RAG 生产级实战:从 0 构建企业智能知识库系统

Spring AI RAG 生产级实战:从 0 构建企业智能知识库系统 摘要:RAG(检索增强生成)是当前最热门的 AI 应用架构。本文基于 Spring AI 框架,手把手教你构建生产级 RAG 知识库系统。涵盖向量数据库选型(PostgreSQL/pgvector、Milvus)、文档处理、向量化、语义检索、与大模型…...