最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ShardingSphere解析SQL示例詳解

 更新時(shí)間:2022年08月01日 09:22:45   作者:周杰倫本人  
這篇文章主要為大家介紹了ShardingSphere解析SQL的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

ShardingSphere的SQL解析,本篇文章源碼基于4.0.1版本

ShardingSphere的分片引擎從解析引擎到路由引擎到改寫(xiě)引擎到執(zhí)行引擎再到歸并引擎,一步一步對(duì)分片操作進(jìn)行處理,我們這篇文章先從解析引擎開(kāi)始,深入分析一下Sql的解析引擎處理流程。

解析Sql的入口

SQLParseEngine這個(gè)類(lèi)是sql解析引擎對(duì)應(yīng)的類(lèi),通過(guò)看它的parse()方法,我們知道sql解析的過(guò)程就是構(gòu)建SQLStatement對(duì)象的過(guò)程,方法中調(diào)用了SQLParseKernel來(lái)創(chuàng)建對(duì)象,然后調(diào)用它的parse()方法來(lái)完成。因此我們把重心放在這個(gè)方法上

解析Sql

SQLParseKernel的parse()方法:

public SQLStatement parse() {
    SQLAST ast = parserEngine.parse();
    Collection<SQLSegment> sqlSegments = extractorEngine.extract(ast);
    Map<ParserRuleContext, Integer> parameterMarkerIndexes = ast.getParameterMarkerIndexes();
    return fillerEngine.fill(sqlSegments, parameterMarkerIndexes.size(), ast.getSqlStatementRule());
}
  • 將原始SQL通過(guò)解析器解析為抽象語(yǔ)法樹(shù)
  • 使用提取器根據(jù)提取規(guī)則提取Sql片段結(jié)合
  • 使用填充器根據(jù)填充規(guī)則填充Sql片段生成SQL解析后的結(jié)果并返回

下面將具體看一下這三步

1. 將 SQL 解析為抽象語(yǔ)法樹(shù)

這一塊是對(duì)應(yīng)的SQLParserEngine的parse()方法,這個(gè)方法的主要邏輯是利用工廠類(lèi)SQLParserFactory來(lái)創(chuàng)建Sql解析器實(shí)例,由于不同的數(shù)據(jù)庫(kù)對(duì)應(yīng)的SQL解析器也不相同,所以這一塊的邏輯也是利用了Java的SPI機(jī)制來(lái)創(chuàng)建配置的SQLParserEntry實(shí)例對(duì)象,根據(jù)不同的數(shù)據(jù)庫(kù)類(lèi)型選擇不同的Sql解析器,最終會(huì)生成SQLAST對(duì)象,也就是SQL 的抽象語(yǔ)法樹(shù)。

2. 提取Sql片段

這一步對(duì)應(yīng)的是SQLSegmentsExtractorEngine的extract()方法,返回的是所有的Sql片段的集合。

遍歷抽象語(yǔ)法樹(shù)中的Sql片段的提取器,提取器分為兩種類(lèi)型,一種是單節(jié)點(diǎn)的Sql片段提取器,這時(shí)候就直接獲取Sql片段,放入集合中就可以了,另一種是樹(shù)狀節(jié)點(diǎn)的Sql片段提取線,這時(shí)候就需要遍歷這棵樹(shù),將結(jié)果放入集合中。看!數(shù)據(jù)結(jié)構(gòu)之樹(shù)的遍歷用到了吧,以后別說(shuō)數(shù)據(jù)結(jié)構(gòu)沒(méi)用了。。

3. 填充Sql片段,生成解析結(jié)果

第三步就是填充得到的Sql片段了,對(duì)應(yīng)的是SQLStatementFillerEngine的fill()方法

public SQLStatement fill(final Collection<SQLSegment> sqlSegments, final int parameterMarkerCount, final SQLStatementRule rule) {
    SQLStatement result = rule.getSqlStatementClass().newInstance();
    Preconditions.checkArgument(result instanceof AbstractSQLStatement, "%s must extends AbstractSQLStatement", result.getClass().getName());
    ((AbstractSQLStatement) result).setParametersCount(parameterMarkerCount);
    result.getAllSQLSegments().addAll(sqlSegments);
    for (SQLSegment each : sqlSegments) {
        Optional<SQLSegmentFiller> filler = parseRuleRegistry.findSQLSegmentFiller(databaseTypeName, each.getClass());
        if (filler.isPresent()) {
            filler.get().fill(each, result);
        }
    }
    return result;
}
  • 獲取SQLStatement對(duì)象,對(duì)SQLStatement進(jìn)行合法性進(jìn)行校驗(yàn)
  • 設(shè)置結(jié)果的參數(shù)的個(gè)數(shù)
  • 將上一步中的SQL片段集合添加到結(jié)果對(duì)象中
  • 遍歷Sql片段,根據(jù)數(shù)據(jù)庫(kù)類(lèi)型和Sql片段找到Sql片段過(guò)濾器,利用Sql片段過(guò)濾器來(lái)填充Sql片段
  • 最后返回解析后的SQLStatement

總結(jié)

這篇文章我們講了ShardingSphere的解析Sql的功能,從它的入口開(kāi)始到它具體解析Sql的過(guò)程,分三步走,第一步將原始SQL解析成抽象語(yǔ)法樹(shù),第二步提取Sql片段,第三步根據(jù)數(shù)據(jù)庫(kù)類(lèi)型和Sql片段選擇相應(yīng)的填充器填充Sql片段,這就是解析Sql的整體過(guò)程了,希望對(duì)你理解ShardingSphere有所幫助。

更多關(guān)于ShardingSphere SQL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用MUI框架構(gòu)建App請(qǐng)求http接口實(shí)例代碼

    使用MUI框架構(gòu)建App請(qǐng)求http接口實(shí)例代碼

    下面小編就為大家分享一篇使用MUI框架構(gòu)建App請(qǐng)求http接口實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Sleuth+logback 設(shè)置traceid 及自定義信息方式

    Sleuth+logback 設(shè)置traceid 及自定義信息方式

    這篇文章主要介紹了Sleuth+logback 設(shè)置traceid 及自定義信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 解決@PostConstruct注解導(dǎo)致的程序無(wú)法啟動(dòng)(@PostConstruct的執(zhí)行)

    解決@PostConstruct注解導(dǎo)致的程序無(wú)法啟動(dòng)(@PostConstruct的執(zhí)行)

    這篇文章主要介紹了解決@PostConstruct注解導(dǎo)致的程序無(wú)法啟動(dòng)(@PostConstruct的執(zhí)行)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解

    Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解

    在某些應(yīng)用場(chǎng)景中需要大量的二維數(shù)組來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ),但是二維數(shù)組中卻有著大量的無(wú)用的位置占據(jù)著內(nèi)存空間,稀疏數(shù)組就是為了優(yōu)化二維數(shù)組,節(jié)省內(nèi)存空間
    2022-09-09
  • java中接口和事件監(jiān)聽(tīng)器的深入理解

    java中接口和事件監(jiān)聽(tīng)器的深入理解

    這篇文章主要給大家介紹了關(guān)于java中接口和事件監(jiān)聽(tīng)器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解SpringBoot啟動(dòng)類(lèi)的掃描注解的用法及沖突原則

    詳解SpringBoot啟動(dòng)類(lèi)的掃描注解的用法及沖突原則

    這篇文章主要介紹了詳解SpringBoot啟動(dòng)類(lèi)的掃描注解的用法及沖突原則,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 超全面的SpringBoot面試題含答案

    超全面的SpringBoot面試題含答案

    這篇文章主要收錄了44道面試中經(jīng)常被問(wèn)的SpringBoot問(wèn)題,不管你是正在求職的新手還是已經(jīng)工作很久的高手,這篇關(guān)于SpringBoot的面試題總結(jié)一定會(huì)讓你有新的理解,讓我們一起來(lái)看看吧
    2023-03-03
  • 詳解Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)

    詳解Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)

    這篇文章主要介紹了Spring Cloud Consul 實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Spring循環(huán)依賴(lài)的解決方法詳解

    Spring循環(huán)依賴(lài)的解決方法詳解

    Spring的解決循環(huán)依賴(lài)是有前置條件的,要解決循環(huán)依賴(lài)我們首先要了解Spring Bean對(duì)象的創(chuàng)建過(guò)程和依賴(lài)注入的方式。依賴(lài)注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進(jìn)行一下小小的回顧
    2022-08-08
  • SpringBoot接口數(shù)據(jù)加解密實(shí)戰(zhàn)記錄

    SpringBoot接口數(shù)據(jù)加解密實(shí)戰(zhàn)記錄

    現(xiàn)今對(duì)于大多數(shù)公司來(lái)說(shuō),信息安全工作尤為重要,下面這篇文章主要給大家介紹了關(guān)于SpringBoot接口數(shù)據(jù)加解密的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評(píng)論

石泉县| 平乡县| 临西县| 靖江市| 莱州市| 柘城县| 区。| 辽阳县| 弋阳县| 杨浦区| 临城县| 含山县| 页游| 象州县| 攀枝花市| 增城市| 和龙市| 九江县| 泉州市| 牡丹江市| 三都| 珠海市| 家居| 新兴县| 高青县| 白河县| 商都县| 海口市| 吐鲁番市| 延安市| 太仆寺旗| 岑溪市| 秦安县| 年辖:市辖区| 浪卡子县| 怀远县| 伊吾县| 武穴市| 东丽区| 绥芬河市| 江西省|