SharingSphere 源码解析 – 真实SQL生成探索
简介
在上一篇文章中,我们探索了ShardingSphere JDBC Mybatis示例执行的一个大致的过程,找到了SQL处理的关键节点,看看一个逻辑的SQL变成真实SQL有哪些关键点
源码解析
注:一番探索下来,逻辑SQL达到真实数据库的处理有点复杂了,需要花不少时间debug,放在一篇也太长了,所以进行拆分,这样简单点
SQL解析生成入口
继续使用上篇文章中示例:ShardingSphere JDBC 语句执行初探
在上文中: executionContext ,是一个非常关键的变量,可以说贯穿全文,经过我们调试发现,其已经具备真实的需要执行的语句,如下图:

那真实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()

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

被折叠的 条评论
为什么被折叠?



