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

解決spring?data?jpa?saveAll()?保存過慢問題

 更新時間:2021年11月23日 10:24:10   作者:telltao  
這篇文章主要介紹了解決spring?data?jpa?saveAll()保存過慢問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

spring data jpa saveAll() 保存過慢

問題發(fā)現(xiàn)

今天在生產環(huán)境執(zhí)行保存數(shù)據時 影響隊列中其他程序的運行 隨后加日志排查 發(fā)現(xiàn) 執(zhí)行 4500條 insert操作時 耗時 9分鐘 我類個去…

解決方案1 此方案在第二天失效了

廢話不多說 直接上配置文件參數(shù)

application-prod.yml 部分參數(shù)如下

  jpa:
  show-sql: false
  hibernate:
    ddl-auto: none
  properties:
    hibernate:
      jdbc:
        #為spring data jpa saveAll方法提供批量插入操作 此處可以隨時更改大小 建議500哦
        batch_size: 500
        batch_versioned_data: true
        order_inserts: true

通過日志打印 執(zhí)行結果如下

未開批處理 4507條 耗時: 227167ms

開啟批處理 500/次 4507條 耗時: 29140ms

開啟批處理 1000/次 4507條 耗時: 29631ms

以上方案有問題,下面附上徹底解決的截圖和記錄

后來發(fā)現(xiàn)在生產運行了一天 還是會導致保存阻塞的問題 100條保存耗時 9分鐘!!!

數(shù)據庫此時數(shù)據有300w條

于是分析 saveAll()的源代碼

在這里插入圖片描述

在這里插入圖片描述

原來這個保存的時候 會去數(shù)據庫查詢這條數(shù)據是否存在 如果存在 則修改 不存在則直接添加 如下圖

在這里插入圖片描述

重寫 saveAll() 的方法 就是仿照它 for循環(huán)里面直接調用 save()方法

 @PersistenceContext()
 protected EntityManager em;

在這里插入圖片描述

此處你們可以改成泛型的方式,提取公共類,封裝一下即可。

JPA的saveAll方法執(zhí)行效率很差

springboot項目中使用了SpringDataJpa的技術,很方便,省了很多dao層繁瑣的步驟,但是有一個接口需要批量更新或者插入,數(shù)據量挺大,大概1-2w條,每條記錄20-30個字段吧,對于剛工作不久的我還是比較大的。我開始使用的saveAll(),因為本地單元測試,也沒考慮那么多(其實更早期更蠢,遍歷再save,壓根不去考慮數(shù)據庫連接池的壓力或者說每次遍歷都要去連接數(shù)據庫的時間損耗…),但是客戶壓力測試,我的接口就拉胯了。接口等待時間太久…誒

剛開始的思路想解決saveAll方法為什么這么慢的問題,因為saveAll是有則更新,無則新增,所以每條記錄都要去比對該記錄是否存在表中,效率比較差(我以后還是用JPA去適應數(shù)據量較小的吧,jpa可能還有什么別的路子后面可以配置進去也行)。

最后改用了mybatis的foreach方式,雖然比較老套而且肯定不是最快的辦法,但是還是實用。

使用過程中,出現(xiàn)了這個報錯:

Packet for query is too large (3227 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.

應該是一下子丟進來的數(shù)據太大,超過了mysql的限制,有人說通過修改數(shù)據庫的max_allowed_packet這個屬性來修改,不過我這里是jenkins部署的服務器,能操作到數(shù)據庫的只有navicat這個可視化工具,如果使用命令行修改這個屬性,好像只能暫時起效。我只好類似分頁,把18000條數(shù)據按照2000一次批量操作,分成9次,這樣既不會報錯,也會比savelAll快一些。后續(xù)再研究一下更快更高效的方法。

數(shù)據庫配置加上allowMultiQueries=true才會支持foreach循環(huán)操作。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • JAVA NIO實現(xiàn)簡單聊天室功能

    JAVA NIO實現(xiàn)簡單聊天室功能

    這篇文章主要為大家詳細介紹了JAVA NIO實現(xiàn)簡單聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • MybatisPlus多條件?or()的使用問題小結

    MybatisPlus多條件?or()的使用問題小結

    這篇文章主要介紹了MybatisPlus多條件?or()的使用問題小結,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • JAVA 內部類詳解及實例

    JAVA 內部類詳解及實例

    這篇文章主要介紹了JAVA 內部類詳解及實例的相關資料,需要的朋友可以參考下
    2016-11-11
  • MybatisPlus 自定義.vm模板的生成

    MybatisPlus 自定義.vm模板的生成

    為更加快捷方便的開發(fā)代碼,使用MybatisPlus的代碼自動生成功能,將一些繁瑣的操作自動生成,本文主要介紹了MybatisPlus 自定義.vm模板的生成,感興趣的可以了解一下
    2024-03-03
  • Spring MVC參數(shù)傳遞中文亂碼解決方法分享

    Spring MVC參數(shù)傳遞中文亂碼解決方法分享

    這篇文章主要介紹了Spring MVC參數(shù)傳遞中文亂碼解決方法分享,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 使用Java實現(xiàn)文件流轉base64

    使用Java實現(xiàn)文件流轉base64

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)文件流轉base64效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • javacv ffmpeg使用原生ffmpeg命令方式

    javacv ffmpeg使用原生ffmpeg命令方式

    在使用javacv集成ffmpeg進行視頻處理時,發(fā)現(xiàn)使用ffmpeg-6.0-1.5.9版本出現(xiàn)原生命令執(zhí)行失敗的問題,通過降級至ffmpeg-5.1.2-1.5.8版本,問題得到解決,此外,ffprobe可以用于獲取視頻屬性,需確保視頻片段屬性一致性
    2024-11-11
  • Java過濾器Filter的基本使用教程

    Java過濾器Filter的基本使用教程

    過濾器通常對一些web資源進行攔截,做完一些處理器再交給下一個過濾器處理,直到所有的過濾器處理器,再調用servlet實例的service方法進行處理。本文將通過示例為大家講解Java中過濾器Filter的用法與實現(xiàn),需要的可以參考一下
    2023-02-02
  • idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案

    idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案

    這篇文章主要介紹了idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 歸并排序時間復雜度過程推導詳解

    歸并排序時間復雜度過程推導詳解

    這篇文章主要介紹了C語言實現(xiàn)排序算法之歸并排序,對歸并排序的原理及實現(xiàn)過程做了非常詳細的解讀,需要的朋友可以參考下,希望能幫助到你
    2021-08-08

最新評論

潢川县| 德安县| 衡水市| 独山县| 新绛县| 霍州市| 泗水县| 辽源市| 南皮县| 历史| 哈巴河县| 双江| 禄丰县| 策勒县| 西充县| 博兴县| 襄樊市| 长治县| 天津市| 吴忠市| 泸西县| 黔西县| 英德市| 高阳县| 大英县| 本溪市| 马关县| 广东省| 花莲市| 黄梅县| 共和县| 襄城县| 车致| 禹州市| 侯马市| 云阳县| 巴林左旗| 上思县| 白沙| 信丰县| 苍梧县|