前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「ShardingSphere」SQL 解析器源码剖析

「ShardingSphere」SQL 解析器源码剖析

原创
作者头像
FoamValue
修改2020-09-23 10:27:36
1.3K0
修改2020-09-23 10:27:36
举报
文章被收录于专栏:FoamValueFoamValue

一、突如其来的兴趣

自从上周写了一个 ShardingSphere 简单入门之后,突然对这个产品产生了浓厚的兴趣。

在阅读官方文档的过程,看到这么一段描述:“核心由SQL解析 => 执行器优化 => SQL路由 => SQL改写 => SQL执行 => 结果归并的流程组成”。

就这么简简单单的6个步骤就能完美解决数据库数据分片问题了?那么这6个步骤的实现代码得有多少呢?

抱着内心这样奇奇怪怪的疑问,让我们来通过本篇文章来剖析“SQL解析器”的源代码吧!

二、官方文档解释

官方使用这个图片来解释,分库分表后的数据查询过程。这里引用下图片以及步骤的简单说明。

SQL解析,分为词法解析和语法解析。 

执行器优化,合并和优化分片条件,如OR等。

SQL路由,根据解析上下文匹配用户配置的分片策略,并生成路由路径

SQL改写,将SQL改写为在真实数据库中可以正确执行的语句。

SQL执行,通过多线程执行器异步执行。

结果归并,将多个执行结果集归并以便于通过统一的JDBC接口输出。

三、先找本文的对象

通过对测试代码的逐步调试,可以找到 SQLParserExecutor 这个类。它将原始的 SQL 字符串拆解成了 ParseTree 的对象。

SQLParserExecutor 文件定位,也就得到了 shardingsphere-sql-parser-engine.jar 这个解析引擎包。

四、jar 源码解析

pom.xml

parent 项目是 shardingsphere-sql-parser 工程。

SQLParserEngineFactory

使用简单工厂与单例的组合模式,根据传入的数据库类型名称获取 SQLParserEngine 对象。

SQLParserEngine

SQL 解析引擎,会将 SQL 语句解析成 ParseTree 对象,然后再通过 ParseTreeVisitorFactory 解析成 SQLStatement 对象进行返回。

同时,最终的解析结果 SQLStatement 对象可以进行缓存。

SPIParskingHook

提供了一个 Hook 钩子的机制。会触发实现 ParsingHook 接口的三个方法,分别是 start、finishSuccess、finishFailure。

ParsingHook

定义的 Hook 接口。

SQLParseResultCache

使用 cache 对 SQL 语句的解析做一个缓存 SQLStatement。

ParseASTNode

封装了一个第三方 antlr 的根节点。

SQLParserExecutor

SQL 的解析器,使用了antlr 的第三方解析插件。

SQLParserFactory

工厂类,根据数据库类型名称、SQL获取 SQLParser 对象。

ParseTreeVisitorFactory

工厂类,根据数据库类型名称、访问规则获取不同的 ParseTreeVisitor 接口实现类。

VisitorRule

数据库 DML、DDL、TCL、DCL、DAL、DML、RL 关键字的枚举。

SQLParsingException

自定义的错误类。

五、总结

以上是“SQL解析器”的源代码内容,这部分代码主要运用到了工厂模式、单例模式、cache 缓存,以及 antlr 解析 SQL 语法的第三方插件来实现的。

同时,也预留了 Hook 的接口便于后续加载 Plugin 插件来实现一些新的功能。


六、非正文部分

今年有幸参加了《腾讯技术创作101训练营第一季》,通过本次参加训练营,get 到了技术写作的一些新方法。本文是对于写作方法的新探索与实践。

对技术写作有兴趣的小伙伴,可以自行观看线上录播。

张彦红<从0开始,快速上手技术写作

https://cloud.tencent.com/edu/learning/live-3107

韩婷<攻克技术写作的基础难题

https://cloud.tencent.com/edu/learning/live-3108

魏伟<从传播角度来谈技术写作如何出彩

https://cloud.tencent.com/edu/learning/live-3109

张敏:https://cloud.tencent.com/edu/learning/live-3111

申琳:https://cloud.tencent.com/edu/learning/live-3112

向治洪:https://cloud.tencent.com/edu/learning/live-3113

张子良:https://cloud.tencent.com/edu/learning/live-3114

【技术创作101训练营】

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档