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

shardingJdbc3.x?版本的分頁bug問題解析

 更新時間:2023年06月02日 11:00:03   作者:雨翔河  
這篇文章主要為大家介紹了shardingJdbc3.x?版本的分頁問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

shardingJdbc 改名為 shardingsphere ,同時項目也已經(jīng)畢業(yè)并成為 Apache 頂級項目,但是這是發(fā)現(xiàn)它的第二個重大 BUG,說明還是有很大的進步空間。

上次發(fā)現(xiàn)的重大 BUG :http://m.fzitv.net/program/286235e92.htm

BUG 的表象是在使用 shardingJdbc3.1.0 進行分頁查詢的時候存在問題,一般情況下 sql 是這樣的格式 limit x,y ,但是不管怎么翻頁查詢,x 的值一直都是 0,這會導(dǎo)致查詢出來的結(jié)果,每一次翻頁的數(shù)據(jù)會越來越多,都包含了前一頁的數(shù)據(jù)。

首先,使用 shardingJdbc 的情況下,理論上就不應(yīng)該存在分頁查詢。 原因可以想象使用 shardingJdbc 是為了分表,既然是分表了那么這種查詢必然會通過條件查詢所有涉及到的表來得出結(jié)果,然后聚合到內(nèi)存來進行分頁,這會使得機器的壓力是巨大的。

所以如果不涉及到分表的情況下,不應(yīng)該是用 shardingJdbc,如果使用了分表就不應(yīng)該這樣搞分頁查詢。

前提條件是理想的情況下,但是在某些情況下,誤用了導(dǎo)致沒有分表策略的表使用了 shardingJdbc 來進行操作也是有可能的。

shardingJdbc3.1.0 在處理 sql 中含有 limit x,y 這種操作的時候會進行特殊處理。

類名: io.shardingsphere.core.routing.router.sharding.ParsingSQLRouter

格式化 SQL 和處理 limit 的操作

以下是截取的一段它的格式化 SQL 和處理 limit 的操作。

@Override
public SQLRouteResult route(final String logicSQL, final List<Object> parameters, final SQLStatement sqlStatement) {
    ......
    if (sqlStatement instanceof SelectStatement && null != ((SelectStatement) sqlStatement).getLimit()) {
        processLimit(parameters, (SelectStatement) sqlStatement);
    }
    ......
}
private void processLimit(final List<Object> parameters, final SelectStatement selectStatement) {
    boolean isNeedFetchAll = (!selectStatement.getGroupByItems().isEmpty() || !selectStatement.getAggregationSelectItems().isEmpty()) && !selectStatement.isSameGroupByAndOrderByItems();
    selectStatement.getLimit().processParameters(parameters, isNeedFetchAll, databaseType);
}

其中 selectStatement.getLimit () 得到的 Limit 類的實現(xiàn)有點問題,這個導(dǎo)致了問題就很大了。

類名: io.shardingsphere.core.parsing.parser.context.limit.Limit 

實現(xiàn)方法

以下是截取的一段它的實現(xiàn)方法

* @param parameters parameters
 * @param isFetchAll is fetch all data or not
 * @param databaseType database type
 */
public void processParameters(final List<Object> parameters, final boolean isFetchAll, final DatabaseType databaseType) {
    fill(parameters);
    rewrite(parameters, isFetchAll, databaseType);
}
private void fill(final List<Object> parameters) {
    int offset = 0;
    if (null != this.offset) {
        offset = -1 == this.offset.getIndex() ? getOffsetValue() : NumberUtil.roundHalfUp(parameters.get(this.offset.getIndex()));
        this.offset.setValue(offset);
    }
    int rowCount = 0;
    if (null != this.rowCount) {
        rowCount = -1 == this.rowCount.getIndex() ? getRowCountValue() : NumberUtil.roundHalfUp(parameters.get(this.rowCount.getIndex()));
        this.rowCount.setValue(rowCount);
    }
    if (offset < 0 || rowCount < 0) {
        throw new SQLParsingException("LIMIT offset and row count can not be a negative value.");
    }
}
private void rewrite(final List<Object> parameters, final boolean isFetchAll, final DatabaseType databaseType) {
    int rewriteOffset = 0;
    int rewriteRowCount;
    if (isFetchAll) {
        rewriteRowCount = Integer.MAX_VALUE;
    } else if (isNeedRewriteRowCount(databaseType)) {
        rewriteRowCount = null == rowCount ? -1 : getOffsetValue() + rowCount.getValue();
    } else {
        rewriteRowCount = rowCount.getValue();
    }
    if (null != offset && offset.getIndex() > -1) {
        parameters.set(offset.getIndex(), rewriteOffset);
    }
    if (null != rowCount && rowCount.getIndex() > -1) {
        parameters.set(rowCount.getIndex(), rewriteRowCount);
    }
}

在對 limit 語法進行處理的時候,會重寫掉這個 offset,使得 offset=0,這就導(dǎo)致了每次向后翻頁操作的數(shù)據(jù)會把前一次的分頁查詢結(jié)果也帶上,每向后翻一頁就會還是從 0 開始讀取數(shù)據(jù)。

所以,解決方案就是如果不是分表就不要去用 shardingJdbc,如果是分表就不要去分頁查詢,性能損耗太嚴重,畢竟它得聚合到內(nèi)存之后再進行分頁處理,這個數(shù)據(jù)量過大的時候真的很容易出事。

如果一定要這么玩,那么看下 shardingJdbc 的新版本 4.x 是否修復(fù)了這個 BUG,聽說已經(jīng)修復(fù)了,沒去試過。

以上就是shardingJdbc3.x 版本的分頁問題解析的詳細內(nèi)容,更多關(guān)于shardingJdbc版本分頁的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java基礎(chǔ)之簡單的圖片處理

    Java基礎(chǔ)之簡單的圖片處理

    這篇文章主要介紹了Java基礎(chǔ)之簡單的圖片處理,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java讓泛型實例化的方法

    Java讓泛型實例化的方法

    這篇文章主要介紹了Java讓泛型實例化的方法,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 使用WebMvcConfigurer配置SpringMVC過程

    使用WebMvcConfigurer配置SpringMVC過程

    WebMvcConfigurer配置類用于Java代碼配置SpringMvc,實現(xiàn)該接口或繼承WebMvcConfigurationSupport類,常用方法:addInterceptors(攔截器)、addViewControllers(視圖控制器)等
    2024-12-12
  • Spring 配置文件字段注入到List、Map

    Spring 配置文件字段注入到List、Map

    這篇文章主要介紹了Spring 配置文件字段注入到List、Map,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • IDEA java出現(xiàn)無效的源發(fā)行版14解決方案

    IDEA java出現(xiàn)無效的源發(fā)行版14解決方案

    這篇文章主要介紹了IDEA java出現(xiàn)無效的源發(fā)行版14解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Spring Cache相關(guān)知識總結(jié)

    Spring Cache相關(guān)知識總結(jié)

    今天帶大家學(xué)習(xí)Spring的相關(guān)知識,文中對Spring Cache作了非常詳細的介紹,對正在學(xué)習(xí)Java Spring的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Spring?myBatis數(shù)據(jù)庫連接異常問題及解決

    Spring?myBatis數(shù)據(jù)庫連接異常問題及解決

    這篇文章主要介紹了Spring?myBatis數(shù)據(jù)庫連接異常問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 為什么rest接口返回json建議采用下劃線形式,不要用駝峰

    為什么rest接口返回json建議采用下劃線形式,不要用駝峰

    為什么rest接口返回json建議采用下劃線形式,不要用駝峰?今天小編就來為大家說明一下原因,還等什么?一起跟隨小編過來看看吧
    2020-09-09
  • Springboot配置全局跨域未生效,訪問接口報錯問題及解決

    Springboot配置全局跨域未生效,訪問接口報錯問題及解決

    這篇文章主要介紹了Springboot配置全局跨域未生效,訪問接口報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Easypoi 輕松實現(xiàn)復(fù)雜excel文件導(dǎo)出功能

    Easypoi 輕松實現(xiàn)復(fù)雜excel文件導(dǎo)出功能

    這篇文章主要介紹了Easypoi 輕松實現(xiàn)復(fù)雜excel文件導(dǎo)出功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11

最新評論

长泰县| 龙泉市| 沙坪坝区| 枝江市| 彩票| 确山县| 丽江市| 图木舒克市| 崇义县| 抚宁县| 五常市| 黑山县| 集安市| 清丰县| 文山县| 绥阳县| 呼伦贝尔市| 桂阳县| 嘉黎县| 错那县| 威信县| 阳朔县| 浠水县| 团风县| 政和县| 宁安市| 平安县| 长武县| 麻江县| 衡南县| 武宁县| 哈尔滨市| 宁陵县| 开封市| 长岭县| 繁昌县| 新疆| 七台河市| 普陀区| 永善县| 天峨县|