亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

1、現(xiàn)象

查出30000多條id

然后用

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

查詢會很慢

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));

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

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

3、總結(jié)

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

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

這個(gè)跟mybatis-plus 的小伙伴提了問題后已經(jīng)解決 可以升級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ā)場景,可就是1000條數(shù)據(jù)的情況下用了8秒 ,這可能與計(jì)算機(jī)的性能有很大的關(guān)系,但就是如此也不至于用八秒鐘,那么用戶體驗(yàn)會很慘的。

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ū)動,才能實(shí)現(xiàn)高性能的批量插入。

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

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

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

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

相關(guān)文章

  • 淺談springboot的三種啟動方式

    淺談springboot的三種啟動方式

    這篇文章主要介紹了淺談springboot的三種啟動方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • dubbo 如何使用logback來輸出日志

    dubbo 如何使用logback來輸出日志

    這篇文章主要介紹了dubbo 如何使用logback來輸出日志的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java request.getParameter中文亂碼解決方法

    java request.getParameter中文亂碼解決方法

    今天跟大家分享幾個(gè)解決java Web開發(fā)中,request.getParameter()獲取URL中文參數(shù)亂碼的解決辦法,需要的朋友可以參考下
    2020-02-02
  • 微服務(wù)架構(gòu)設(shè)計(jì)RocketMQ基礎(chǔ)及環(huán)境整合

    微服務(wù)架構(gòu)設(shè)計(jì)RocketMQ基礎(chǔ)及環(huán)境整合

    這篇文章主要介紹了微服務(wù)架構(gòu)設(shè)計(jì)入門RocketMQ的基礎(chǔ)及環(huán)境整合實(shí)現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Jdk1.8 HashMap實(shí)現(xiàn)原理詳細(xì)介紹

    Jdk1.8 HashMap實(shí)現(xiàn)原理詳細(xì)介紹

    這篇文章主要介紹了Jdk1.8 HashMap實(shí)現(xiàn)原理詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • java文件刪除不了的坑,特別是壓縮文件問題

    java文件刪除不了的坑,特別是壓縮文件問題

    這篇文章主要介紹了java文件刪除不了的坑,特別是壓縮文件問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java使用Swagger接口框架方法詳解

    Java使用Swagger接口框架方法詳解

    這篇文章主要介紹了Java使用Swagger接口框架方法,Swagger是一個(gè)方便我們更好的編寫API文檔的框架,而且Swagger可以模擬http請求調(diào)用,感興趣的同學(xué)可以參考下文
    2023-05-05
  • java轉(zhuǎn)換字符串編碼格式的方法

    java轉(zhuǎn)換字符串編碼格式的方法

    這篇文章主要介紹了java轉(zhuǎn)換字符串編碼格式的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Java?8?的異步編程利器?CompletableFuture的實(shí)例詳解

    Java?8?的異步編程利器?CompletableFuture的實(shí)例詳解

    這篇文章主要介紹了Java?8?的異步編程利器?CompletableFuture?詳解,本文通過一個(gè)例子給大家介紹下Java?8??CompletableFuture異步編程的相關(guān)知識,需要的朋友可以參考下
    2022-03-03
  • 淺談spring使用策略模式實(shí)現(xiàn)多種場景登錄方式

    淺談spring使用策略模式實(shí)現(xiàn)多種場景登錄方式

    本文主要介紹了spring使用策略模式實(shí)現(xiàn)多種場景登錄方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論