0%
- 模块结构
sharding-core-merge的主要功能是利用属性DatabaseType databaseType;
,SQLRouteResult routeResult;
(route产生),SelectSQLStatementContext selectSQLStatementContext;
(preprocess产生),List<QueryResult> queryResults;
(execute模块产生),产生MergedResult。按功能分类可以分成三个部分:
- org.apache.shardingsphere.core.merge.dal。包含若干DAL操作相关的MergedResult实现类和DALMergeEngine是一个合并引擎。此引擎对外提供merge()功能,负责将DAL操作的相关结果合并,返回包内定义的MergedResult实体类。
- org.apache.shardingsphere.core.merge.dql。包含若干DQL操作相关的MergedResult实现类和DQLMergeEngine是一个合并引擎。此引擎对外提供merge()功能,负责将DQL操作的相关结果合并,返回包内定义的MergedResult实体类。
- org.apache.shardingsphere.core.merge。包含MergedResult和MergeEngine接口的定义。MergeEngineFactory,负责创建MergeEngine实例。TransparentMergeEngine是一个合并引擎,实现了MergeEngine接口,此方法不对queryResults进行处理,直接返回迭代流式MergeResult。
- 模块结构图
- 主要逻辑流程和关键类分析
分片执行的主要逻辑是从***MergeEngine实现类开始的。这里以DQLMergeEngine为例子,进行分析。首先判断List<QueryResult> queryResults;
是否为1,如果为1则不需要处理,直接创建迭代流式归并MergedResult。否则,判断是否为orderBy或groupby,并创建相关MergedResult。最后,对分页进行处理,也就是在decorate()方法中,根据数据库类型,创建不同MergeResult。
- 设计模式和设计原则
- 简单工厂方法
MergeEngineFactory.newInstance()方法,根据SQLStatement类型来创建不同的MergeEngine。具体的MergeEngine类型为:DQLMergeEngine,DALMergeEngine,TransparentMergeEngine。MergeEngineFactory的存在方便了不同类型的MergeEngine创建,调用者不再需要关心如何创建MergeEngine,而只需要把这件事交给MergeEngineFactory就行。
- 适配器模式
LocalMergedResultAdapter类是一个抽象类,它实现了MergedResult接口的部分方法,使得它的子类ShowDatabasesMergedResult
和ShowShardingCTLMergedResult
无需MergedResult接口的所有方法。当实现类和接口的方法无法完全匹配时,可以考虑使用适配器模式。