亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

來自 PostgreSQL 的流行(具有獲取大小)

來自 PostgreSQL 的流行(具有獲取大?。?/h1>
小怪獸愛吃肉 2022-11-02 17:10:45
我想從 PostgreSQL 11.2 流式傳輸結果,而不是一次將所有結果讀取到內存中。我使用最新的穩定版 SpringBoot 2.1.4.RELEASE。我閱讀了如何在 MySQL 中執行此操作的文章。 http://knes1.github.io/blog/2015/2015-10-19-streaming-mysql-results-using-java8-streams-and-spring-data.html 我還閱讀了如何在 PostgreSQL 中執行此操作的文章: Java 8 JPA 存儲庫在 Postgresql 中逐行流式傳輸我有這樣的存儲庫:public interface ProductRepository extends JpaRepository<Product, UUID> {    @Query("SELECT p from Product p")    @QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "50"))    Stream<Product> streamAll();}比我這樣使用流:  productRepository.streamAll().forEach(product -> export(product));為了使示例更簡單,'export' 方法是完全空的。當我調用該方法時,我看到了 Hibernate 查詢Hibernate: select product0_.id as id1_0_, product0_.created as created2_0_, product0_.description as descript3_0_, product0_.name as name4_0_, product0_.product_type_id as product_5_0_ from products product0_ order by product0_.id一段時間后,我有 OutOfMemoryError。查詢提示沒有幫助。如何使用 Spring Boot 存儲庫(甚至 EntityManager)讀取數據并以最佳方式從 DB 加載行。我知道我可以進行分頁,但正如文章中所寫的那樣,這不是最理想的方式。
查看完整描述

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);

});


查看完整回答
反對 回復 2022-11-02
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

目前使用 spring 檢索所有數據,并且 Stream 僅應用于內存中已經存在的數據。

如果您查看它的來源,org.springframework.data.jpa.provider.PersistenceProvider它似乎使用 aScrollableResults來流式傳輸數據。

通常ScrollableResults檢索內存中的所有數據。

您可以在此處找到使用 MySql 數據庫的有趣的完整分析,但對于 Postgres 數據庫可能同樣適用。

因此,如果您認為使用實際上不需要使用大量內存的解決方案,它也會這樣做,因為底層實現沒有使用最佳實現。


查看完整回答
反對 回復 2022-11-02
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

我遇到了完全相同的問題,經過對 Spring Data 和 Hibernate 內部的長時間調試,找到了對我有用的解決方案。

因此,要在 PostgreSQL 中使用游標獲取數據,它應該是帶有 Stream 結果 + 注釋的方法(kotlin 語法):

@QueryHints(QueryHint(name = org.hibernate.annotations.QueryHints.FETCH_SIZE, value = "50"))

哪個值應該是 50 或其他值 - 這并不重要??赡苣斎肓隋e誤的提示名稱。


查看完整回答
反對 回復 2022-11-02
  • 3 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號