欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決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ù)據(jù)時 影響隊列中其他程序的運行 隨后加日志排查 發(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ù)據(jù)庫此時數(shù)據(jù)有300w條

于是分析 saveAll()的源代碼

在這里插入圖片描述

在這里插入圖片描述

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

在這里插入圖片描述

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

 @PersistenceContext()
 protected EntityManager em;

在這里插入圖片描述

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

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

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

剛開始的思路想解決saveAll方法為什么這么慢的問題,因為saveAll是有則更新,無則新增,所以每條記錄都要去比對該記錄是否存在表中,效率比較差(我以后還是用JPA去適應數(shù)據(jù)量較小的吧,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ù)據(jù)太大,超過了mysql的限制,有人說通過修改數(shù)據(jù)庫的max_allowed_packet這個屬性來修改,不過我這里是jenkins部署的服務器,能操作到數(shù)據(jù)庫的只有navicat這個可視化工具,如果使用命令行修改這個屬性,好像只能暫時起效。我只好類似分頁,把18000條數(shù)據(jù)按照2000一次批量操作,分成9次,這樣既不會報錯,也會比savelAll快一些。后續(xù)再研究一下更快更高效的方法。

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

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

相關文章

  • Spring源碼解密之自定義標簽與解析

    Spring源碼解密之自定義標簽與解析

    這篇文章主要給大家介紹了關于Spring源碼解密之自定義標簽與解析的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參借鑒,下面隨著小編來一起學習學習吧。
    2018-01-01
  • Java之SSM中bean相關知識匯總案例講解

    Java之SSM中bean相關知識匯總案例講解

    這篇文章主要介紹了Java之SSM中bean相關知識匯總案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • MyBatis多表操作查詢功能

    MyBatis多表操作查詢功能

    這篇文章主要介紹了MyBatis多表操作,包括一對一查詢,一對多查詢的模型,多對多查詢的需求,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • SpringBoot整合Mybatis簡單實現(xiàn)增刪改查

    SpringBoot整合Mybatis簡單實現(xiàn)增刪改查

    這篇文章主要介紹了SpringBoot整合Mybatis簡單實現(xiàn)增刪改查,文章為圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 解決參數(shù)命名不規(guī)范,造成使用@NotNull進行校驗出現(xiàn)的問題

    解決參數(shù)命名不規(guī)范,造成使用@NotNull進行校驗出現(xiàn)的問題

    這篇文章主要介紹了解決參數(shù)命名不規(guī)范,造成使用@NotNull進行校驗出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java Spring5學習之JdbcTemplate詳解

    Java Spring5學習之JdbcTemplate詳解

    這篇文章主要介紹了Java Spring5學習之JdbcTemplate詳解,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • 非常詳細的Java異常處理機制知識整理大全

    非常詳細的Java異常處理機制知識整理大全

    Java異常指在程序運行時可能出現(xiàn)的一些錯誤,比如試圖打開一個根本不存在的文件等,異常處理將會改變程序的控制流程,讓程序有機會對錯誤做出處理,下面這篇文章主要給大家介紹了關于Java異常處理機制知識整理的相關資料,需要的朋友可以參考下
    2022-11-11
  • Java?如何用二維數(shù)組創(chuàng)建空心菱形

    Java?如何用二維數(shù)組創(chuàng)建空心菱形

    這篇文章主要介紹了Java?如何用二維數(shù)組創(chuàng)建空心菱形,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實現(xiàn)SMS短信通發(fā)送手機驗證碼案例講解

    Java實現(xiàn)SMS短信通發(fā)送手機驗證碼案例講解

    這篇文章主要介紹了Java實現(xiàn)SMS短信通發(fā)送手機驗證碼案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • MyBatis注解開發(fā)之實現(xiàn)自定義映射關系和關聯(lián)查詢

    MyBatis注解開發(fā)之實現(xiàn)自定義映射關系和關聯(lián)查詢

    本文主要詳細介紹了MyBatis注解開發(fā)中,實現(xiàn)自定義映射關系和關聯(lián)查詢,文中有詳細的代碼示例,對學習MyBatis有一定的參考價值,需要的朋友可以參考閱讀
    2023-04-04

最新評論