首頁 > Java > 主體

如何監控 Spring Data JPA 流

WBOY
發布: 2024-02-22 14:01:07
轉載
1241 人瀏覽過

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.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板