面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

sharding-jdbc

├── sharding-jdbc-core 重写DataSource/Connection/Statement/ResultSet四大对象

└── sharding-jdbc-orchestration 配置中心

sharding-core

├── sharding-core-api 接口和配置类

├── sharding-core-common 通用分片策略实现…

├── sharding-core-entry SQL解析、路由、改写,核心类BaseShardingEngine

├── sharding-core-route SQL路由,核心类StatementRoutingEngine

├── sharding-core-rewrite SQL改写,核心类ShardingSQLRewriteEngine

├── sharding-core-execute SQL执行,核心类ShardingExecuteEngine

└── sharding-core-merge 结果合并,核心类MergeEngine

shardingsphere-sql-parser

├── shardingsphere-sql-parser-spi SQLParserEntry,用于初始化SQLParser

├── shardingsphere-sql-parser-engine SQL解析,核心类SQLParseEngine

├── shardingsphere-sql-parser-relation

└── shardingsphere-sql-parser-mysql MySQL解析器,核心类MySQLParserEntry和MySQLParser

shardingsphere-underlying 基础接口和api

├── shardingsphere-rewrite SQLRewriteEngine接口

├── shardingsphere-execute QueryResult查询结果

└── shardingsphere-merge MergeEngine接口

shardingsphere-spi SPI加载工具类

sharding-transaction

├── sharding-transaction-core 接口ShardingTransactionManager,SPI加载

├── sharding-transaction-2pc 实现类XAShardingTransactionManager

└── sharding-transaction-base 实现类SeataATShardingTransactionManager

sharding-jdbc中的四大对象


所有的一切都从 ShardingDataSourceFactory 开始的,创建了一个 ShardingDataSource 的分片数据源。除了 ShardingDataSource(分片数据源),在 Sharding-Sphere 中还有 MasterSlaveDataSourceFactory(主从数据源)、EncryptDataSourceFactory(脱敏数据源)。

public static DataSource createDataSource(

final Map<String, DataSource> dataSourceMap,

final ShardingRuleConfiguration shardingRuleConfig,

final Properties props) throws SQLException {

return new ShardingDataSource(dataSourceMap,

new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), props);

}

说明: 本文主要以 ShardingDataSource 为切入点分析 Sharding-Sphere 是如何对 JDBC 四大对象 DataSource、Connection、Statement、ResultSet 进行封装的。

DataSource

这里,涉及到两个比较重要的接口,一个是DataSource,一个是Connection。我们首先来看下它们的类图。

  • DataSource

在这里插入图片描述

  • Connection

在这里插入图片描述

DataSource 和 Connection 都比较简单,没有处理过多的逻辑,只是 dataSourceMap, shardingRule 进行简单的封装。

ShardingDataSource 持有对数据源和分片规则,可以通过 getConnection 方法获取 ShardingConnection 连接。

private final ShardingRuntimeContext runtimeContext = new ShardingRuntimeContext(

dataSourceMap, shardingRule, props, getDatabaseType());

@Override

public final ShardingConnection getConnection() {

return new ShardingConnection(getDataSourceMap(), runtimeContext,

TransactionTypeHolder.get());

}

Connection

ShardingConnection 可以创建 Statement 和 PrepareStatement 两种运行方式,如下代码所示。

@Override

public Statement createStatement(final int resultSetType,

final int resultSetConcurrency, final int resultSetHoldability) {

return new ShardingStatement(this, resultSetType,

resultSetConcurrency, resultSetHoldability);

}

@Override

public PreparedStatement prepareStatement(final String sql, final int resultSetType,

final int resultSetConcurrency, final int resultSetHoldability)

throws SQLException {

return new ShardingPreparedStatement(this, sql, resultSetType,

resultSetConcurrency, resultSetHoldability);

}

说明: ShardingConnection 主要是将创建 ShardingStatement 和 ShardingPreparedStatement 两个对象,主要的执行逻辑都在 Statement 对象中。另外,ShardingConnection 还有两个重要的功能,一个是获取真正的数据库连接,一个是事务提交功能。

Statement

Statement 相对来说比较复杂,因为它都是 JDBC 的真正执行器,所有逻辑都封装在 Statement 中。我们来看下Statement的类图

在这里插入图片描述

对于Statement,我就不做过对的描述了,相信使用过JDBC的小伙伴,对Statement都不陌生了。

ResultSet

ResultSet类图如下所示。

在这里插入图片描述

我们从源码中可以看出:ShardingResultSet 只是对 MergedResult 的简单封装。

private final MergedResult mergeResultSet;

@Override

public boolean next() throws SQLException {

return mergeResultSet.next();

}

sharding-jdbc-core核心分析


ShardingStatement 内部有三个核心的类,一是 SimpleQueryShardingEngine 完成 SQL 解析、路由、改写;一是 StatementExecutor 进行 SQL 执行;最后调用 MergeEngine 对结果进行合并处理。

ShardingStatement

初始化

private final ShardingConnection connection;

private final StatementExecutor statementExecutor;

public ShardingStatement(final ShardingConnection connection) {

this(connection, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY,

ResultSet.HOLD_CURSORS_OVER_COMMIT);

}

public ShardingStatement(final ShardingConnection connection, final int resultSetType,

final int resultSetConcurrency, final int resultSetHoldability) {

super(Statement.class);

this.connection = connection;

statementExecutor = new StatementExecutor(resultSetType, resultSetConcurrency,

resultSetHoldability, connection);

}

ShardingStatement 内部执行 SQL 委托给了 statementExecutor。

执行

(1)executeQuery 执行过程

@Override

public ResultSet executeQuery(final String sql) throws SQLException {

ResultSet result;

try {

clearPrevious();

// 1. SQL 解析、路由、改写,最终生成 SQLRouteResult

shard(sql);

// 2. 生成执行计划 SQLRouteResult -> StatementExecuteUnit

initStatementExecutor();

// 3. statementExecutor.executeQuery() 执行任务

MergeEngine mergeEngine = MergeEngineFactory.newInstance(

connection.getRuntimeContext().getDatabaseType(),

connection.getRuntimeContext().getRule(), sqlRouteResult,

connection.getRuntimeContext().getMetaData().getRelationMetas(),

statementExecutor.executeQuery());

// 4. 结果合并

result = getResultSet(mergeEngine);

} finally {

currentResultSet = null;

}

currentResultSet = result;

return result;

}

(2)SQL 路由(包括 SQL 解析、路由、改写)

private SQLRouteResult sqlRouteResult;

private void shard(final String sql) {

ShardingRuntimeContext runtimeContext = connection.getRuntimeContext();

SimpleQueryShardingEngine shardingEngine = new SimpleQueryShardingEngine(

runtimeContext.getRule(), runtimeContext.getProps(),

runtimeContext.getMetaData(), runtimeContext.getParseEngine());

sqlRouteResult = shardingEngine.shard(sql, Collections.emptyList());

}

SimpleQueryShardingEngine 进行 SQL 路由(包括 SQL 解析、路由、改写),生成 SQLRouteResult,当 ShardingStatement 完成 SQL 的路由,生成 SQLRouteResult 后,剩下的执行任务就全部交给 StatementExecutor 完成。

StatementExecutor

StatementExecutor 内部封装了 SQL 任务的执行过程,包括:SqlExecutePrepareTemplate 类生成执行计划 StatementExecuteUnit,以及 SQLExecuteTemplate 用于执行 StatementExecuteUnit。

类结构

在这里插入图片描述

重要属性

难道这样就够了吗?不,远远不够!

提前多熟悉阿里往年的面试题肯定是对面试有很大的帮助的,但是作为技术性职业,手里有实打实的技术才是你面对面试官最有用的利器,这是从内在散发出来的自信。

备战阿里时我花的最多的时间就是在学习技术上,占了我所有学习计划中的百分之70,这是一些我学习期间觉得还是很不错的一些学习笔记

我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服

阿里一面就落马,恶补完这份“阿里面试宝典”后,上岸蚂蚁金服

image.png

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。

今天就分享到这里了,谢谢大家的关注,以后会分享更多的干货给大家!

[外链图片转存中…(img-BSN9e9dw-1713558971948)]

[外链图片转存中…(img-hkY9DfIZ-1713558971949)]

[外链图片转存中…(img-thQQpbec-1713558971949)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-nSKGcwn7-1713558971950)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值