前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ShardingSphere整合Mybatis执行流程学习一

ShardingSphere整合Mybatis执行流程学习一

作者头像
路行的亚洲
发布于 2024-06-27 11:52:16
发布于 2024-06-27 11:52:16
63300
代码可运行
举报
文章被收录于专栏:后端技术学习后端技术学习
运行总次数:0
代码可运行

由于业务需求中,需要写一些逻辑,同时为了优化业务响应,这里对分库分表的中间件在业务中的使用,进行了自己的学习和记录。下面是对ShardingSphere学习的记录。

ShardingSphere整合Mybatis的时候,执行的相关流程,这里我们从整体的执行流程来学习。以下代码结合ShardingSphere的4.X系列学习。

一、 ShardingSphere增强数据源

SpringBootConfiguration#dataSource中会创建数据源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public DataSource dataSource() throws SQLException {
        return null == this.masterSlaveProperties.getMasterDataSourceName() ? ShardingDataSourceFactory.createDataSource(this.dataSourceMap, this.shardingProperties.getShardingRuleConfiguration(), this.configMapProperties.getConfigMap(), this.propMapProperties.getProps()) : MasterSlaveDataSourceFactory.createDataSource(this.dataSourceMap, this.masterSlaveProperties.getMasterSlaveRuleConfiguration(), this.configMapProperties.getConfigMap(), this.propMapProperties.getProps());
    }

可以看到创建的数据源中分片上下文的相关信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public ShardingContext(Map<String, DataSource> dataSourceMap, ShardingRule shardingRule, DatabaseType databaseType, Properties props) throws SQLException {
        this.databaseMetaData = this.getDatabaseMetaData(dataSourceMap);
        this.shardingRule = shardingRule;
        this.databaseType = databaseType;
        this.shardingProperties = new ShardingProperties(null == props ? new Properties() : props);
        int executorSize = (Integer)this.shardingProperties.getValue(ShardingPropertiesConstant.EXECUTOR_SIZE);
        this.executeEngine = new ShardingExecuteEngine(executorSize);
        this.metaData = new ShardingMetaData(this.getDataSourceURLs(dataSourceMap), shardingRule, databaseType, this.executeEngine, new JDBCTableMetaDataConnectionManager(dataSourceMap), (Integer)this.shardingProperties.getValue(ShardingPropertiesConstant.MAX_CONNECTIONS_SIZE_PER_QUERY), (Boolean)this.shardingProperties.getValue(ShardingPropertiesConstant.CHECK_TABLE_METADATA_ENABLED));
    }

首先ShardingJdbc的相关配置信息是从ShardingDataSource的分片数据源开始去做一个数据源的填充和增强操作的。解析配置信息,然后创建sharding上下文。

数据源运行期上下文=> 分片规则、sql路由引擎、执行引擎等相关的信息

二、分片算法的复写

同时如果我们自定义对应的分片算法,此时需要复写PreciseShardingAlgorithm这个接口。比如我们项目里面就使用了

image-20240621142737656

根据经销商代码进行分片。我们在getOwnerShard中,完成了业务需求的分片逻辑。目前是按照分表的逻辑来进行的。

为了能够获取对应的经销商信息,我们在拦截器中添加了对登录信息中分片经销商信息进行拦截。方便sql的拼接。

三、ShardingSphere执行分库分表的流程

以insert为例来看整个执行过程:

首先sql的执行经过mybatis,然后走到mybatis的MybatisMapperProxy代理,通过动态代理拿到对应的方法,执行对应的实现。

而进入到ShardingSphere的逻辑是在Mybatis的PreparedStatementHandler#update时来到ShardingPreparedStatement的execute方法。

这里是进入ShardingSpehere的入口,我理解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public boolean execute() throws SQLException {
    try {
        clearPrevious();
        prepare();
        initPreparedStatementExecutor();
        return preparedStatementExecutor.execute();
    } finally {
        clearBatch();
    }
}

这段代码包含了ShardingJDBC的四个过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
解析+路由+改写 => prepare()
执行 => preparedStatementExecutor.execute()

这四个过程从这里开始。除此之外,查询还有一个归并的过程。

可以看到prepare的执行过程其实是一个解析+路由的过程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public ExecutionContext prepare(final String sql, final List<Object> parameters) {
        List<Object> clonedParameters = cloneParameters(parameters);
        // 先进行解析再执行路由
        RouteContext routeContext = executeRoute(sql, clonedParameters);
        ExecutionContext result = new ExecutionContext(routeContext.getSqlStatementContext());
        // 执行rewrite操作
        result.getExecutionUnits().addAll(executeRewrite(sql, clonedParameters, routeContext));
        if (properties.<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW)) {
            SQLLogger.logSQL(sql, properties.<Boolean>getValue(ConfigurationPropertyKey.SQL_SIMPLE), result.getSqlStatementContext(), result.getExecutionUnits());
        }
        return result;
    }

完成这个操作之后,就可以执行初始化PreparedStatementExecutor。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private void initPreparedStatementExecutor() throws SQLException {
        preparedStatementExecutor.init(executionContext);
        setParametersForStatements();
        replayMethodForStatements();
    }

可以看到初始化预编译语句执行器。

执行sql的过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    /**
     * Execute SQL.
     *
     * @return return true if is DQL, false if is DML
     * @throws SQLException SQL exception
     */
    public boolean execute() throws SQLException {
        boolean isExceptionThrown = ExecutorExceptionHandler.isExceptionThrown();
        SQLExecuteCallback<Boolean> executeCallback = SQLExecuteCallbackFactory.getPreparedSQLExecuteCallback(getDatabaseType(), isExceptionThrown);
        List<Boolean> result = executeCallback(executeCallback);
        if (null == result || result.isEmpty() || null == result.get(0)) {
            return false;
        }
        return result.get(0);
    }

这里是sql执行的关键。

从上面的代码看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
prepare();
initPreparedStatementExecutor();
preparedStatementExecutor.execute();

这三行代码是完成执行的关键。

同时从上面,我们还可以看到除了execute()这个方法之外,还存在:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
executeQuery()、executeQuery()、addBatch()

这几个方法。

而在查询executeQuery()中,可以看到有一个归并结果集的操作mergeQuery:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public ResultSet executeQuery() throws SQLException {
    ResultSet result;
    try {
        clearPrevious();
        prepare();
        initPreparedStatementExecutor();
        // 执行查询,并对查询进行归并
        MergedResult mergedResult = mergeQuery(preparedStatementExecutor.executeQuery());
        result = new ShardingResultSet(preparedStatementExecutor.getResultSets(), mergedResult, this, executionContext);
    } finally {
        clearBatch();
    }
    currentResultSet = result;
    return result;
}

说完了上面的流程和执行过程,下面我们来看看为什么能够扩展?

四、ShardingPreparedStatement以execute打头方法执行原因

那为什么说ShardingPreparedStatement的execute方法是执行的入口呢?下面是ShardingPreparedStatement的类图:

从上面,我们可以看到因为其实现了PreparedStament接口,进行了自己的扩展。这也是为什么ShardingPreparedStatement能够执行以execute打头方法执行原因。

上面我们只是简单的整理了一下ShardingSphere结合Mybatis的执行流程。

其中prepare()这个过程和preparedStatementExecutor.execute这个过程里面包含了很多代码。需要细细的研究。

参考:

https://github.com/apache/shardingsphere

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
远程玩3A大作要多少帧?ToDesk、向日葵、UU远程性能对决
最近经常在网上刷到各种3A游戏,丰富逼真的游戏画面和激烈的战斗场景让我振奋不已。想起自己自从换上Mac之后,就很少接触Steam中的大型游戏了,就连之前爆火的国产3A大作《黑神话:悟空》也没玩过,说来也是惭愧。众所周知,Mac对游戏支持有限,但是作为Mac用户的我也想体验一把国产3A大作的魅力,于是我请教了很多用Mac的朋友,看看他们是怎样用Mac玩游戏的。问了一圈发现,他们很多人都是用远程软件去玩的大型游戏,这给了我很大的兴趣,于是我赶紧测试了市面上三款主流远程软件:ToDesk、向日葵和UU远程,看看哪个更适合远程畅玩3A游戏。
是Dream呀
2025/06/30
1471
远程控制用什么软件比较好?评测四款主流软件:TeamViewer、Splashtop、向日葵、ToDesk
在现代企业中,远程控制软件已成为不可或缺的工具。无论是远程工作,远程解决技术问题,还是进行远程协作,选择一款合适的远程控制软件对企业效率和安全性至关重要。本文将从安全性、性能、性价比、稳定性、流畅性和清晰度等方面详细评测四款主流远程控制软件:TeamViewer、Splashtop,向日葵、ToDesk,帮助您做出最佳选择。
Loki
2024/07/30
2.1K0
远程控制用什么软件比较好?评测四款主流软件:TeamViewer、Splashtop、向日葵、ToDesk
四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
远程桌面软件对于职场人来说并不陌生,可以说是必备的办公软件之一。在经历过新冠疫情后,大家对于远程办公的认识越来越深入,也就在这段期间,远程桌面软件大范围的应用起来,真正走进大众视野并融入我们的工作和生活。
Python兴趣圈
2023/11/10
70.6K1
四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
无论你是 DevOps 运维工程师、自由开发者,还是需要远程办公、远程剪辑乃至远程教学的普通用户,一款兼顾 “远程桌面 + 文件传输 + 内网穿透 + 异地组网” 的工具都能让效率几何级跃升。
猫头虎
2025/05/22
8220
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
十大远程控制软件排名
TeamViewer来自德国,自2005年推出以来,已经成为全球最具影响力的远程桌面工具之一。它提供了功能强大的远程连接解决方案,用户可以轻松远程访问、控制、管理和维护设备。TeamViewer已经在全球超过25亿台设备上安装,深受跨国企业和个人用户的喜爱。它的特点是支持广泛的设备和平台,用户能够跨平台操作,适用于IT支持、远程维护等场景。
Loki
2024/10/22
1.8K0
十大远程控制软件排名
再见付费的 TeamViewer,这款国产轻量级远程控制软件是绝佳的替代品!
前段时间,我们公司使用的向日葵远程控制竟然崩了,导致无法登录,当时以为是公司网络出问题了,结果并妹有。后来就看到官方回应说,因为大量用户涌入导致服务器宕机了!
沉默王二
2022/08/26
2.5K0
再见付费的 TeamViewer,这款国产轻量级远程控制软件是绝佳的替代品!
【每日精选时刻】远程控制用什么软件比较好?6 张配图通俗易懂说透 K8S 请求和限制;Java后端面试宝典
大家吼,我是你们的朋友煎饼狗子——喜欢在社区发掘有趣的作品和作者。【每日精选时刻】是我为大家精心打造的栏目,在这里,你可以看到煎饼为你携回的来自社区各领域的新鲜出彩作品。点此一键订阅【每日精选时刻】专栏,吃瓜新鲜作品不迷路! *当然,你也可以在本篇文章,评论区自荐/推荐他人优秀作品(标题+链接+推荐理由),增加文章入选的概率哟~
社区好文捕手-煎饼狗子
2024/08/30
1940
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
远程控制的安全性已经算半个老生常谈的问题了,作为常年远程办公的人,这里我只想说一句,无论你用什么软件都会有安全上的隐患,做不到百分百的安全,但相对安全,咱们还是可以自主把控的。
海拥
2023/09/19
2.2K0
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
什么软件能远程控制电脑桌面
什么软件可以远程控制电脑?在中国市场上,有几款远程控制电脑的软件非常受欢迎,它们分别是Splashtop、TeamViewer、AnyDesk和向日葵。下面分别介绍和对比这几款软件。
Loki
2024/07/26
2370
什么软件能远程控制电脑桌面
win 远程桌面管理软件推荐
说到远程桌面软件,有专业软件,也有业余的软件。非专业软件一般只能提供基础的远程连接功能,没法提供。下面推荐几款专业的远程桌面连接工具,都具备完善的团队管理功能。
Loki
2024/09/10
2870
win 远程桌面管理软件推荐
yyds 又一款远程控制神器!
Windows专业版自带的远程控制确实是比较难用,如果你装的系统是Windows家庭版,还不能远程控制别人的电脑。
快学Python
2023/10/23
6891
yyds 又一款远程控制神器!
【愚公系列】2024远控性能大解密!5款评价最高远控软件ToDesk、TeamViewer、向日葵、Parsec、AirDroid谁与争锋?
大家好,我是愚公代码,一个始终关注技术发展和应用实践的编程爱好者。相信很多人无论是出门办公、还是下班后在家学习,都曾面临过不想携带笔记本电脑的情况。在这样的时刻,远程桌面控制软件就展现出了其独特的价值,它能让我们在任何地点,只要有网络连接,就能远程操作自己的电脑,既省心又省力。
愚公搬代码
2024/03/06
2.6K0
向日葵远程控制遭勒索病毒攻击系谣言 贝锐官方已发公告辟谣
上海贝锐信息科技有限公司旗下的向日葵远程控制软件在国内占据较高份额,不少企业依赖向日葵远程控制对企业实施降本增效,如疫情期间的远程办公,和无人守值设备远程维护。 但最近有人在朋友圈谣传向日葵远控出现安全漏洞导致勒索软件蔓延,提醒用户使用向日葵远控后立即卸载
王同学要努力
2022/11/15
1.5K0
向日葵远程控制遭勒索病毒攻击系谣言 贝锐官方已发公告辟谣
如何选择一款真正好用的远程控制软件
无论是开发人员、运维人员、测试人员,还是非从事互联网工作的其他人员,在工作中肯定会存在需要远程控制其他电脑的需求。
Loki
2022/08/05
1.1K0
如何选择一款真正好用的远程控制软件
远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比
在数字化时代,一款卓越的远程控制软件需兼顾功能与体验:流畅连接确保指令实时响应,高清画质还原操作细节,低门槛UI设计降低使用难度,毫秒级延迟提升操作连贯性,多功能满足多样化需求。同时,优秀的远程控制软件还应具备独树一帜的远控安全技术,会通过前瞻性安全策略来阻挡各类网络风险和安全威胁,为用户打造全方位、可信赖的安全体验。在“远程密钥、身份认证、隐私屏”等一系列基础安全防护上做出更多创新,如 ToDesk 安全进阶的创新功能“二次验证保护”,可以称为是目前国内最安全远控的核心依据。
Francek Chen
2025/05/26
4940
远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比
向日葵又出现安全漏洞,还有没有更好的远控软件值得推荐?
之前一直使用teamviewer进行远程的操作,但是众所周知这是一款国外的软件,并且判定为商业行为的概率越来越高了,加上收费价格昂贵,性价比很低,所以慢慢就弃用了。后来国产软件向日葵进入人们的视野,几乎成为远程办公必备的软件,但是慢慢发现向日葵开始限速,随之带来的是色彩断层严重影响了体验,但是一直没有找到合适的软件,所以只能忍受卡一点慢一点的极差用户体验。
石臻臻的杂货铺[同名公众号]
2022/03/03
2.3K0
向日葵又出现安全漏洞,还有没有更好的远控软件值得推荐?
亲身体验后,为你安利 3 个远程桌面控制软件~
小詹最近入手了一台mac pro,很是轻便,以后出差开会或者在家都不用背着那台服役了6年都厚板砖了。
小小詹同学
2019/06/20
1.4K0
亲身体验后,为你安利 3 个远程桌面控制软件~
疫情趋势下,远程控制软件成为刚需,ToDesk or 向日葵,哪一款最好用?
自 2020 年疫情爆发以来,为了避免员工外出感染的风险,很多企业被迫改变经营模式,从传统的办公室上班模式逐渐变为远程在家办公。既然是远程办公,当然离不开远程控制软件,这一年多时间我算是什么远程软件都见识过了,最离谱的 2021 年了居然还有人在用 QQ 远程桌面?比较常用的就是 TEAM、ToDesk 和向日葵,当然还有一些通过 VPN 来远程拨号连接的,下面我们来看看哪一款最好用?
Lucifer三思而后行
2022/04/13
2.3K0
疫情趋势下,远程控制软件成为刚需,ToDesk or 向日葵,哪一款最好用?
向日葵软件在渗透测试中的应用
向日葵远程控制软件是一款免费的集远程控制电脑/手机/平板、远程桌面连接、远程开机、远程管理、支持内网穿透的一体化远程控制管理工具软件,且还能进行远程文件传输、远程摄像头监控等。
潇湘信安
2022/09/22
2K0
向日葵软件在渗透测试中的应用
Win10软件:推荐两款Windows操作系统下的远程软件,值得收藏!
远程控制软件是程序员日常必备的工具,现场市面上有微软自带的远程连接工具、向日葵、teamviewer等远程控制软件。他们都有一个共同的缺点,无法针对远程连接设置分组、别名。大多数情况下,我们可能需要连接十几个甚至几十个Windows远程服务器。如果都是ip地址的话,很难都记得住。
小明互联网技术分享社区
2021/11/02
5.9K0
推荐阅读
远程玩3A大作要多少帧?ToDesk、向日葵、UU远程性能对决
1471
远程控制用什么软件比较好?评测四款主流软件:TeamViewer、Splashtop、向日葵、ToDesk
2.1K0
四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
70.6K1
【远程工具系列】节点小宝、RustDesk、向日葵、ToDesk、TeamViewer、AnyDesk ——六款主流远程控制软件横向测评对比
8220
十大远程控制软件排名
1.8K0
再见付费的 TeamViewer,这款国产轻量级远程控制软件是绝佳的替代品!
2.5K0
【每日精选时刻】远程控制用什么软件比较好?6 张配图通俗易懂说透 K8S 请求和限制;Java后端面试宝典
1940
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
2.2K0
什么软件能远程控制电脑桌面
2370
win 远程桌面管理软件推荐
2870
yyds 又一款远程控制神器!
6891
【愚公系列】2024远控性能大解密!5款评价最高远控软件ToDesk、TeamViewer、向日葵、Parsec、AirDroid谁与争锋?
2.6K0
向日葵远程控制遭勒索病毒攻击系谣言 贝锐官方已发公告辟谣
1.5K0
如何选择一款真正好用的远程控制软件
1.1K0
远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比
4940
向日葵又出现安全漏洞,还有没有更好的远控软件值得推荐?
2.3K0
亲身体验后,为你安利 3 个远程桌面控制软件~
1.4K0
疫情趋势下,远程控制软件成为刚需,ToDesk or 向日葵,哪一款最好用?
2.3K0
向日葵软件在渗透测试中的应用
2K0
Win10软件:推荐两款Windows操作系统下的远程软件,值得收藏!
5.9K0
相关推荐
远程玩3A大作要多少帧?ToDesk、向日葵、UU远程性能对决
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验