來自 PostgreSQL 的流行(具有獲取大?。?/h1>
3 回答

TA貢獻1796條經驗 獲得超10個贊
您必須在工作完成后分離實體。
import javax.persistence.EntityManager;
...
@Autowired
private EntityManager entityManager;
...
// Your business logic
productRepository.streamAll().forEach(product -> {
export(product);
// must detach so that garbage collector can reclaim the memory.
entityManager.detach(product);
});

TA貢獻1831條經驗 獲得超9個贊
目前使用 spring 檢索所有數據,并且 Stream 僅應用于內存中已經存在的數據。
如果您查看它的來源,org.springframework.data.jpa.provider.PersistenceProvider
它似乎使用 aScrollableResults
來流式傳輸數據。
通常ScrollableResults
檢索內存中的所有數據。
您可以在此處找到使用 MySql 數據庫的有趣的完整分析,但對于 Postgres 數據庫可能同樣適用。
因此,如果您認為使用實際上不需要使用大量內存的解決方案,它也會這樣做,因為底層實現沒有使用最佳實現。

TA貢獻1757條經驗 獲得超8個贊
我遇到了完全相同的問題,經過對 Spring Data 和 Hibernate 內部的長時間調試,找到了對我有用的解決方案。
因此,要在 PostgreSQL 中使用游標獲取數據,它應該是帶有 Stream 結果 + 注釋的方法(kotlin 語法):
@QueryHints(QueryHint(name = org.hibernate.annotations.QueryHints.FETCH_SIZE, value = "50"))
哪個值應該是 50 或其他值 - 這并不重要??赡苣斎肓隋e誤的提示名稱。
添加回答
舉報