SharingSphere 源码解析 -- 真实SQL生成探索

本文深入解析SharingSphere源码,探讨逻辑SQL如何转化为真实SQL的过程。从SQL解析生成入口开始,逐步剖析routeContext、rewriteResult和result的作用,揭示路由信息和SQL重写的关键步骤。虽然复杂,但通过调试已找到生成SQL的主要路径,为后续深入理解打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SharingSphere 源码解析 – 真实SQL生成探索


简介

在上一篇文章中,我们探索了ShardingSphere JDBC Mybatis示例执行的一个大致的过程,找到了SQL处理的关键节点,看看一个逻辑的SQL变成真实SQL有哪些关键点

源码解析

注:一番探索下来,逻辑SQL达到真实数据库的处理有点复杂了,需要花不少时间debug,放在一篇也太长了,所以进行拆分,这样简单点

SQL解析生成入口

继续使用上篇文章中示例:ShardingSphere JDBC 语句执行初探

在上文中: executionContext ,是一个非常关键的变量,可以说贯穿全文,经过我们调试发现,其已经具备真实的需要执行的语句,如下图:

image.png

那真实SQL生成的关键代码就如下,也就是上文中与Mybatis承接的部分

# ShardingSpherePreparedStatement.java
    @Override
    public boolean execute() throws SQLException {
   
   
        try {
   
   
            clearPrevious();
	    // 在这就已经生成了真实的SQL等语句
            executionContext = createExecutionContext();
            if (metaDataContexts.getMetaData(connection.getSchemaName()).getRuleMetaData().getRules().stream().anyMatch(each -> each instanceof RawExecutionRule)) {
   
   
                // TODO process getStatement
                Collection<ExecuteResult> executeResults = rawExecutor.execute(createRawExecutionGroupContext(), executionContext.getLogicSQL(), new RawSQLExecutorCallback());
                return executeResults.iterator().next() instanceof QueryResult;
            }
            if (executionContext.getRouteContext().isFederated()) {
   
   
                List<QueryResult> queryResults = executeFederatedQuery();
                return !queryResults.isEmpty();
            }
            ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = createExecutionGroupContext();
            cacheStatements(executionGroupContext.getInputGroups());
            return driverJDBCExecutor.execute(executionGroupContext,
                    executionContext.getLogicSQL()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值