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 或其他值 - 这并不重要。可能您输入了错误的提示名称。
添加回答
举报