sharding-jdbc源码解析之词法解析

本文转自“天河聊技术”微信公众号

 

在看词法解析之前我们先看下sharding-jdbc的项目结构,美利金融财务平台项目采用的是1.5版本,因此这里的源码解析是针对这个版本进行源码解析的,后续的版本中实现大纲是没变的,因此这里的源码解析不会影响对其他版本的源码理解。

 

源码项目结构如下

18141535_j4zu.jpg

sharding-jdbc-config-parent模块是sharding-jdbc自身为了和spring集成实现的一些配置。

sharding-jdbc-core是主要实现。

sharding-jdbc-transaction-parent是柔性事务实现。

 

core maven子项目的包结构

com.dangdang.ddframe.rdb.sharding.parsing.lexer 词法解析。

com.dangdang.ddframe.rdb.sharding.api 定义了分片规则相关的抽象实现。

com.dangdang.ddframe.rdb.sharding.executor 执行逻辑。

com.dangdang.ddframe.rdb.sharding.merger 结果集归并实现。

com.dangdang.ddframe.rdb.sharding.parsing sql解析实现

com.dangdancom.dangdang.ddframe.rdb.sharding.rewrite sql改写实现。

com.dangdang.ddframe.rdb.sharding.routing.router sql路由实现。

 

词法解析

这个类就是词法解析的引擎类

18141535_kRc0.jpg

那么什么地方会调用这个类呢,肯定是解析sql的时候才会解析词法,因此我们找源码中关于sql解析实现,因此我们找到了这个类引用了对词法解析引擎类的实现

18141535_DUCK.jpg

 

那么我们想看词法解析的具体实现,我们就要找到这个类的一个具体实现或者引用这个类的具体实现类跟下源码,于是我们找到了一个select语句解析器的抽抽象类中引用了AbstractSQLParser引用,离✌️不远了,我们接着找这个select语句解析器抽象类的实现类,我们以闪电般的速度找到了一个mysql实现,我们随便找一个MySQLSelectParser类的一个方法。

我们进入到skipAll()这个方法,我们锁定了词法解析器的业务方法

18141536_GuDj.jpg

当然对源码比较熟悉的直接就可以找到这个方法,我们这里的步骤是针对大家第一遍看源码怎么找源码看,相信大家都有一种无处下手的感觉,曾几何时我也是,好的,书归正传,我们找到了词法解析器的业务方法,那么我就来看下这个实现逻辑是什么样的。

18141536_6Fre.jpg

 

词法解析业务方法

18141536_a8vv.jpg

skipIgnoredToken()这行代码是跳过无用的token

new Tokenizer(input, dictionary, offset) 这行代码中的dictionary是具体数据库的关键字字典,词法解析器引擎的mysql子类

104918_bzR8_3775437.gif词法解析器引擎类业务方法中有扫描变量、字符串、标识符、十六进制数、数字、符号的实现,我们跟踪下扫描符号的实现,其他的都一样,看下这行代码

currentToken = new Tokenizer(input, dictionary, offset).scanSymbol();

18141536_U0Rd.jpg

18141536_9GyK.jpg

看上图 词法解析引擎中保存了当前的token,sql解析就是根据解析到的这个当前token进行下一步sql解析的,到这里词法解析流程就结束了,仅供参考。

 

欢迎关注本人微信公众号“天河聊技术”,有更多javaWeb技术、架构、互金行业大数据相关的技术源码解析的文章。

 

转载于:https://my.oschina.net/u/3775437/blog/1641734

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值