java - 来自 PostgreSQL 的流行(具有获取大小)
问题描述
我想从 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 加载行。我知道我可以进行分页,但正如文章中所写的那样,这不是最理想的方式。
解决方案
目前使用 spring 检索所有数据,并且 Stream 仅应用于内存中已经存在的数据。
如果您查看它的来源,org.springframework.data.jpa.provider.PersistenceProvider
它似乎使用 aScrollableResults
来流式传输数据。
通常ScrollableResults
检索内存中的所有数据。
您可以在此处找到使用 MySql 数据库的有趣的完整分析,但对于 Postgres 数据库可能同样适用。
因此,如果您认为使用实际上不需要使用大量内存的解决方案,它也会这样做,因为底层实现没有使用最佳实现。
推荐阅读
- android - Android Studio - 移除的依赖不会从外部库中移除
- ffmpeg - 作为服务运行时,ffmpeg -hls_time 选项无法正常工作
- android - 我可以在一个 HTTP 请求中从谷歌距离矩阵 api 获取所有数据吗?
- swift - 带有自动布局的 uiscrollview 的动态内容未按预期工作
- php - 未捕获的 ArgumentCountError。分解意义
- php - PSR-4 自动加载选项没有在我的项目中加载类?
- c# - 脚本任务 C# 中的命令超时
- google-cloud-platform - 是否可以使用 gcloud CLI 启动 GCP 市场条目?
- d3.js - D3 力有向图 - 如何过滤节点和关联链接?
- react-native - 在 React-Native 上实现 Google Cloud Speech-to-Text