搜尋
首頁Java如何監控 Spring Data JPA 流

php小編柚子為您帶來關於監控Spring Data JPA流的java問答。在開發過程中,監控資料流的即時情況對於系統效能最佳化和故障排除至關重要。本文將介紹如何監控Spring Data JPA流,讓您更了解資料處理過程,及時發現問題並進行相應處理。一起來探討如何有效監測Spring Data JPA流,提升系統穩定性與效能!

問題內容

我正在嘗試按照此部落格上的說明使用 spring data jpa 流。但是,我無法透過任何日誌監控該過程或進度。當進程嘗試批量提取資料時,我是否應該看到日誌中列印多個 sql 查詢?如果不是,那麼我怎麼知道所有行都沒有一次性載入?

其他部落格(例如此部落格和此部落格)建議我應該將mysql 的hint_fetch_size 設為integer.min_value ,我認為這可能是解決方案,但這會引發以下異常:

2024-01-29 14:40:20.843 警告 78247 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.sqlexceptionhelper:sql 錯誤:0,sqlstate:s1000 2024-01-29 14:40:20.843錯誤78247 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.sqlexceptionhelper:串流結果集com.mysql.cj.protocol.a.result. resultsetrowsstreaming@ 4ca63fa5 仍然活躍。當任何流結果集在給定連接上開啟並使用時,不得發出任何語句。在嘗試更多查詢之前,請確保您已對任何活動的流結果集呼叫 .close()。 結束時間:48 org.springframework.orm.jpa.jpasystemexception:無法擷取結果集;巢狀異常是 org.hibernate.exception.genericjdbcexception:無法擷取 resultset 在 org.springframework.orm.jpa.vendor.hibernatejpadialect.converthibernateaccessexception(hibernatejpadialect.java:331)

這是我的儲存庫程式碼:

@QueryHints(value = {
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "false"),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_READONLY, value = "true"),
})
@Query("SELECT s FROM Salary s")
Stream<Salary> findAllStream();

我想我想得到一個保證,如果以上是在 spring data jpa 中使用 stream 查詢的正確方法,因為我自己無法可靠地監控 streaming 的性能?

更新

上述異常是由於在同一呼叫方法中重複呼叫 findallstream 方法而發生的。刪除其中一個修復了該異常。

解決方法

我找不到任何日誌配置來顯示資料是否正在批次提取。但我確實找到了一種在本地測試效能的方法。

為了測試流程功能,我需要存取包含數百萬筆記錄的資料庫。我使用 docker 映像 https://www.php.cn/link/7092d5eb1bbca1a22bdc69ba3f517e68 來使用 mysql 員工資料

設定 docker 映像後,我在將 mysql workbench 與伺服器連接時遇到問題。看起來 docker 映像未配置為接受預設設定的 ssl 連線。我必須停用 use ssl 標誌才能建立連線。此設定出現在 mysql 工作台的 ssl 標籤下。

應用程式中的連接字串也必須以下列方式配置:

spring.datasource.url=jdbc:mysql://localhost:3307/employees?verifyservercertificate=false&usessl=false&requiressl=false

員工資料庫中的資料包含一個名為 salaries 的表,該表約有 280 萬行。

為了進行測試,我編寫了一個小型 spring data jpa 應用程序,該應用程式在存儲庫類中具有以下方法以及一個簡單的控制器來調用這些方法:

@Override
List<Salary> findAll();

@QueryHints(value = {
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_CACHEABLE, value = "false"),
        @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_READONLY, value = "true"),
})

@Query("SELECT s FROM Salary s")
Stream<Salary> findAllStream();

然後我編寫了一小段程式碼,將讀取的資料轉換為 json 對象,然後使用多個執行緒寫回檔案中。這是為了模擬現實案例中的處理。

這是我觀察到的。

  • 使用 list 方法時,記憶體使用量顯著增加。最初的查詢花費了大部分時間,但是當所有資料載入完畢後,實際的資料處理任務很快就完成了。

  • 使用 stream 方法時,對記憶體使用的影響幾乎不明顯。但整體來說,與list方法相比,完成處理部分的表現相似甚至更差。

結論

我的上述發現使我得出結論,存儲庫方法的 stream 返回類型僅應在存在內存不足風險時使用,即獲得 out 內存異常 。否則,如果您的應用程式已經在足夠大的伺服器上運行,則對記憶體使用的整體影響幾乎不會被注意到,並且只有在您的進程快速完成時才會是暫時的。

來自 intellij profiler 的記憶體使用統計資料

  • left -> 當列表方法運行時
  • 右 -> 當流方法運行時

以上是如何監控 Spring Data JPA 流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:stackoverflow。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),