由于结果集的大小,我需要在作业中使用 HibernateCursorItemReader,但我无法使其与 EntityGraph 一起工作以急切地获取一些关系。我正在使用 QueryProvider。
没有任何 EntityGraph 就不会发生连接,并且读取器可以正常工作,但是在批处理期间,Hibernate 会执行大量 SQL 查询以延迟获取数据。这导致处理非常缓慢。
使用查询提示来获取它,任务在此时冻结Loader.class
:
ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st );
上面的代码在doOpen
HibernateCursorItemReader 的方法中调用,在第一个项目之前。没有错误,没有堆栈跟踪,几分钟内什么也没有,直到我停止 JVM。
我现在正在使用 HibernatePagingItemReader,使用相同的 QueryProvider 并提示急切地获取数据。但是在使用集合获取实体时分页效率不高,JVM 经常会出现内存不足的情况。
抱歉缺少示例代码,但我所拥有的是提到的类的默认配置和实现,没有什么具体可展示的。我认为光标阅读器是解决方案,但它如何与 EntityGraph 一起使用?
编辑 1
EntityGraph 和 HibernateCursorItemReader 一起使用似乎没有问题。耐心等待更多时间,处理开始了。它只是比平常慢,但是休眠的光标阅读器的工作方式与分页阅读器相同,获取所有实体图。