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

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

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

引言

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

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

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

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

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

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

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

類名: 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)有點(diǎ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 語法進(jìn)行處理的時候,會重寫掉這個 offset,使得 offset=0,這就導(dǎo)致了每次向后翻頁操作的數(shù)據(jù)會把前一次的分頁查詢結(jié)果也帶上,每向后翻一頁就會還是從 0 開始讀取數(shù)據(jù)。

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

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

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

相關(guān)文章

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

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

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

    Java讓泛型實例化的方法

    這篇文章主要介紹了Java讓泛型實例化的方法,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(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,文中通過示例代碼介紹的非常詳細(xì),對大家的學(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解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Spring Cache相關(guān)知識總結(jié)

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

    今天帶大家學(xué)習(xí)Spring的相關(guān)知識,文中對Spring Cache作了非常詳細(xì)的介紹,對正在學(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)出功能,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11

最新評論

太湖县| 克山县| 江北区| 千阳县| 文水县| 大安市| 苗栗市| 蒙城县| 建始县| 临海市| 崇左市| 息烽县| 清水县| 鄂尔多斯市| 德庆县| 礼泉县| 长治县| 金门县| 锦州市| 淮安市| 南康市| 杨浦区| 彩票| 托克逊县| 西青区| 崇礼县| 策勒县| 通山县| 左云县| 山西省| 沙湾县| 奉新县| 石嘴山市| 枣阳市| 五指山市| 株洲市| 万安县| 琼结县| 德安县| 五华县| 彭阳县|