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()