【发布时间】:2020-09-25 04:19:53
【问题描述】:
由于结果集的大小,我需要在作业中使用 HibernateCursorItemReader,但我无法使其与 EntityGraph 一起工作以急切地获取一些关系。我正在使用 QueryProvider。
在没有任何 EntityGraph 的情况下,不会发生连接,并且读取器可以正常工作,但是在批处理过程中,Hibernate 会执行大量 SQL 查询以延迟获取数据。这会导致处理速度非常慢。
使用查询提示获取它,任务在Loader.class这一点冻结:
ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st );
上面的代码在 HibernateCursorItemReader 的 doOpen 方法中调用,在第一个项目之前。没有错误,没有堆栈跟踪,几分钟内什么也没有,直到我停止 JVM。
我现在正在使用 HibernatePagingItemReader,它具有相同的 QueryProvider 和提示以急切地获取数据。但是分页在获取带有集合的实体时效率不高,JVM 经常会出现内存不足。
很抱歉缺少示例代码,但我所拥有的是所提到的类的默认配置和实现,没有什么具体可展示的。我认为光标阅读器是解决方案,但它如何与 EntityGraph 一起使用?
编辑 1
EntityGraph 和 HibernateCursorItemReader 一起使用似乎没什么问题。耐心等待更多时间,处理开始了。它只是比平时慢,但 hibernate 的光标阅读器的工作方式与分页阅读器相同,获取所有实体图。
【问题讨论】:
-
为什么不能使用
HibernateCursorItemReader.setQueryString或HibernateCursorItemReader.setQueryName而不是HibernateQueryProvider,然后在传递的HQL 中使用JOIN FETCH? -
我的查询有 80 个连接,只是很难写,但我会试试看是否有效
标签: hibernate spring-batch entitygraph iqueryprovider