使用Hibernate 讀取大型結果集的最佳化策略
本文解決了使用HibernateMySQL 資料庫讀取9000 萬筆記錄的挑戰,而無需使用Hibernate RAM 過載。
ScrollableResults限制
最初,使用者嘗試利用 Hibernate 的 ScrollableResults 增量地流式傳輸結果。但是,MySQL Connector/J 函式庫不提供真正的捲動功能,會將整個結果集載入到記憶體中,導致 OutOfMemoryError 異常。
setFirstResult/setMaxResults 與 ScrollableResults
作為解決方法,使用者考慮使用 setFirstResult 和 setMaxResults 迭代來取得批次結果。但是,由於為每個批次初始化新查詢的開銷,這種方法可能效率較低,特別是對於大型結果集。
使用本機SQL 最佳化批次擷取
受訪者建議的最佳解決方案是脫離MySQL J/Connector並使用批次查詢:
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
此查詢根據先前確定的前一批記錄的最大ID 抓取一批記錄,並按ID 升序對它們進行排序。 batch_size 參數決定一次檢索的記錄數。這種方法可確保僅在記憶體中處理可管理數量的記錄,從而防止記憶體耗盡。
以上是如何使用 Hibernate 高效地從 MySQL 取得 9000 萬筆記錄而不耗盡記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!