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

解決mybatis-plus 查詢耗時(shí)慢的問題

 更新時(shí)間:2021年07月03日 14:42:41   作者:cuixinzhou  
這篇文章主要介紹了解決mybatis-plus 查詢耗時(shí)慢的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

mybatis-plus 查詢耗時(shí)慢

1、現(xiàn)象

查出30000多條id

然后用

EntityWrapper ew = new EntityWrapper<>();
 ew.in(TableFieldConstant.F_AUTH_RESULT_ID, ids);

查詢會(huì)很慢

2、原因

跟了一下mybatis-plus源碼

 protected String formatSqlIfNeed(boolean need, String sqlStr, Object... params) {
        if (need && !StringUtils.isEmpty(sqlStr)) {
            if (ArrayUtils.isNotEmpty(params)) {
                for(int i = 0; i < params.length; ++i) {
                    String genParamName = "MPGENVAL" + this.paramNameSeq.incrementAndGet();
                    sqlStr = sqlStr.replace(String.format("{%s}", i), String.format("#{%s.paramNameValuePairs.%s}", this.getParamAlias(), genParamName));
                    this.paramNameValuePairs.put(genParamName, params[i]);
                }
            }
 
            return sqlStr;
        } else {
            return null;
        }
    }

問題出現(xiàn)在

sqlStr = sqlStr.replace(String.format("{%s}", i), String.format("#{%s.paramNameValuePairs.%s}", this.getParamAlias(), genParamName));

對(duì)replace 測(cè)試 發(fā)現(xiàn)當(dāng)數(shù)據(jù)量大時(shí)替換會(huì)很耗時(shí) 測(cè)試的遍歷了30000次拼接從1到30000 替換耗時(shí)20多秒

對(duì) apache-commons-lang 的StringUtis.replace測(cè)試是耗時(shí)7秒多

3、總結(jié)

把使用mybaits 批量查詢改為 手寫sql查詢 之后問題解決

使用mybatis-plus批量操作時(shí)要謹(jǐn)慎 能寫sql盡量寫sql

這個(gè)跟mybatis-plus 的小伙伴提了問題后已經(jīng)解決 可以升級(jí)jar版本 3.x

mybatis-plus 處理大數(shù)據(jù)量太慢

大批量數(shù)據(jù)插入方法是Mybatis的foreach拼接SQL

我發(fā)現(xiàn)不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,實(shí)際上在插入的時(shí)候仍然是一條條記錄的插,速度遠(yuǎn)不如原來Mybatis的foreach拼接SQL的方法。

// 第一步判斷更新或添加
 String[] splitUserId = userGroup.getUserId().split(",");
 String[] spiltUserName = userGroup.getUserName().split(",");
 if (StringUtils.isBlank(userGroup.getId())) {
  userGroup.setNum(spiltUserName.length);
  userGroupMapper.insert(userGroup);
 } else {
  userGroup.setNum(spiltUserName.length);
  userGroupMapper.updateById(userGroup);
 }
 /* 第二部刪除中間表信息,字段冗余 */

 Map<String, Object> columnMap = new HashMap<String, Object>();
 columnMap.put("USER_GROUP_ID", userGroup.getId());
 groupUsersService.removeByMap(columnMap);

 /* 第三步,批量保存中間表 */

 if (splitUserId.length != 0) {
  List<GroupUsers> groupUsersList = Lists.newArrayList();
  for (int i = 0; i < splitUserId.length; i++) {
   GroupUsers gu = new GroupUsers();
   gu.setUserId(splitUserId[i]);
   gu.setUserName(spiltUserName[i]);
   gu.setUserGroupId(userGroup.getId());
   groupUsersList.add(gu);
  }
  groupUsersService.saveBatch(groupUsersList);
 }

1、就是這樣的一種情景也很符合大部分的開發(fā)場(chǎng)景,可就是1000條數(shù)據(jù)的情況下用了8秒 ,這可能與計(jì)算機(jī)的性能有很大的關(guān)系,但就是如此也不至于用八秒鐘,那么用戶體驗(yàn)會(huì)很慘的。

2、JDBC連接URL字符串中需要新增一個(gè)參數(shù):

rewriteBatchedStatements=true url: jdbc:mysql://192.168.1.143:3306/rt_xxxxxx_test?useUnicode=true&characterEncoding=utf-8&rewriteBatchedStatements=true

3、MySQL的JDBC連接的url中要加rewriteBatchedStatements參數(shù),并保證5.1.13以上版本的驅(qū)動(dòng),才能實(shí)現(xiàn)高性能的批量插入。

4、MySQL JDBC驅(qū)動(dòng)在默認(rèn)情況下會(huì)無視executeBatch()語句,把我們期望批量執(zhí)行的一組sql語句拆散,一條一條地發(fā)給MySQL數(shù)據(jù)庫,批量插入實(shí)際上是單條插入,直接造成較低的性能。

只有把rewriteBatchedStatements參數(shù)置為true, 驅(qū)動(dòng)才會(huì)幫你批量執(zhí)行SQL

另外這個(gè)選項(xiàng)對(duì)INSERT/UPDATE/DELETE都有效

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合Spring Security的詳細(xì)教程

    SpringBoot整合Spring Security的詳細(xì)教程

    這篇文章主要介紹了SpringBoot整合Spring Security的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java SSM框架如何添加寫日志功能

    Java SSM框架如何添加寫日志功能

    這篇文章主要介紹了Java SSM框架如何添加寫日志功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java的覆寫操作實(shí)例分析

    Java的覆寫操作實(shí)例分析

    這篇文章主要介紹了Java的覆寫操作,結(jié)合實(shí)例形式分析了java屬性覆寫及super調(diào)用父類方法覆寫相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Java中List排序的三種實(shí)現(xiàn)方法實(shí)例

    Java中List排序的三種實(shí)現(xiàn)方法實(shí)例

    其實(shí)Java針對(duì)數(shù)組和List的排序都有實(shí)現(xiàn),對(duì)數(shù)組而言你可以直接使用Arrays.sort,對(duì)于List和Vector而言,你可以使用Collections.sort方法,下面這篇文章主要給大家介紹了關(guān)于Java中List排序的三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2021-12-12
  • 使用Java調(diào)用Yolo模型的基本步驟

    使用Java調(diào)用Yolo模型的基本步驟

    Yolo(You Only Look Once)是一種基于深度學(xué)習(xí)的目標(biāo)檢測(cè)算法,它可以在一張圖像中同時(shí)檢測(cè)出多個(gè)目標(biāo),并給出它們的位置和類別,這篇文章主要介紹了使用Java調(diào)用Yolo模型的基本步驟,需要的朋友可以參考下
    2024-03-03
  • SpringBoot實(shí)現(xiàn)評(píng)論回復(fù)功能(數(shù)據(jù)庫設(shè)計(jì))

    SpringBoot實(shí)現(xiàn)評(píng)論回復(fù)功能(數(shù)據(jù)庫設(shè)計(jì))

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)評(píng)論回復(fù)功能(數(shù)據(jù)庫設(shè)計(jì)),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • java反射之獲取類的信息方法(推薦)

    java反射之獲取類的信息方法(推薦)

    下面小編就為大家?guī)硪黄猨ava反射之獲取類的信息方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Kafka日志清理實(shí)現(xiàn)詳細(xì)過程講解

    Kafka日志清理實(shí)現(xiàn)詳細(xì)過程講解

    這篇文章主要為大家介紹了Kafka日志清理實(shí)現(xiàn)詳細(xì)過程講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫的代碼示例

    在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫的代碼示例

    在現(xiàn)代微服務(wù)架構(gòu)中,通常需要與多個(gè)數(shù)據(jù)庫交互的服務(wù),這可能是由于各種原因,例如遺留系統(tǒng)集成、不同類型的數(shù)據(jù)存儲(chǔ)需求,或者僅僅是為了優(yōu)化性能,在本綜合指南中,我們將探討如何在 Spring Boot 微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫連接,需要的朋友可以參考下
    2024-12-12
  • java中JSONArray互相轉(zhuǎn)換List的實(shí)現(xiàn)

    java中JSONArray互相轉(zhuǎn)換List的實(shí)現(xiàn)

    本文主要介紹了java中JSONArray互相轉(zhuǎn)換List的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論

莱阳市| 金湖县| 保定市| 普格县| 南陵县| 杭锦旗| 重庆市| 江阴市| 华坪县| 长沙县| 新邵县| 江川县| 德化县| 怀宁县| 靖西县| 巴中市| 曲松县| 阜康市| 滦南县| 沽源县| 荃湾区| 和平区| 安庆市| 客服| 定兴县| 通州区| 高台县| 曲阳县| 栾城县| 昭苏县| 安康市| 赫章县| 大冶市| 南昌县| 木兰县| 扎兰屯市| 五寨县| 阿合奇县| 湟源县| 沐川县| 黑山县|