【发布时间】:2019-09-20 23:42:28
【问题描述】:
我想从 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 Repository Stream row-by-row in 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 加载行。 我知道我可以进行分页,但是就像文章中写的那样,这不是最优化的方式。
【问题讨论】:
-
你用流做什么?您可能需要从中收集所有数据吗?那么问题与此有关吗?
-
使用该流发布方法的代码。
-
在帖子中我展示了我如何使用流。
-
这似乎是正确的。所以这取决于你在导出方法中做了什么。或者它取决于 JpaRepository 的实现。你也可以发布导出方法吗?
-
我在帖子里写的,导出方法有空体。什么也没做。我收到 OutOfMemoryError 是因为我一次阅读了所有内容。如何逐段阅读?
标签: java postgresql spring-boot jpa spring-boot-jpa