Hibernate 的ScrollableResults 介面提供了一種迭代查詢結果的方法,而無需整個結果集載入到記憶體中。然而,正如這個問題所強調的,如果使用 MySQL Connector/J 驅動程序,則使用具有大量記錄的 ScrollableResults 可能會導致記憶體問題。
在這種情況下,唯一實用的選擇是迭代結果使用 setFirstResult 和 setMaxResults 方法批次。雖然這種方法可能看起來效率低下,尤其是在處理大偏移量時,但它是避免記憶體問題的最可靠方法。
理想情況下,應使用無狀態會話來防止任何會話層級快取或髒追蹤問題.
另一個潛在的最佳化是使用id 欄位作為索引的最後一列,並修改查詢以一次檢索一批記錄,使用上一批的最高id作為起點。如果查詢中的 other_conditions 使用相等條件,這可以提高效能。
透過以下修改查詢:
select * from person where id > <max_id_of_last_batch> and <other_conditions> order by id asc limit <batch_size>
您可以避免載入大偏移量造成的效能損失,並獲得更多高效的迭代過程。
以上是如何使用 Hibernate 高效處理 9000 萬筆記錄而不耗盡記憶體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!