Java HibernateCursorItemReader结果集已关闭

Java HibernateCursorItemReader结果集已关闭,java,hibernate,session,spring-batch,Java,Hibernate,Session,Spring Batch,我使用的是spring批处理HibernateCursorItemReader,它的定义如下 <bean class="org.springframework.batch.item.database.HibernateCursorItemReader" scope="step" id="priceListFctrItemReader"> <property name="queryName" value="FIND_ALL_PRICE_LIST_FCT

我使用的是spring批处理HibernateCursorItemReader,它的定义如下

    <bean class="org.springframework.batch.item.database.HibernateCursorItemReader"
      scope="step" id="priceListFctrItemReader">
    <property name="queryName" value="FIND_ALL_PRICE_LIST_FCTR_ITEM_ID_BY_MONTRY_FCTR_VER"/>
    <property name="sessionFactory" ref="sessionFactory"/>
    <property name="parameterValues">
        <map>
            <entry key="factorVersion" value="#{jobParameters['current.factor.version']}"/>
            <entry key="trueValue" value="#{true}"/>
        </map>
    </property>
</bean>
再往下

Caused by: java.sql.SQLException: Result set already closed
at weblogic.jdbc.wrapper.ResultSet.checkResultSet(ResultSet.java:144)
at weblogic.jdbc.wrapper.ResultSet.preInvocationHandler(ResultSet.java:93)
我在SpringBoot中没有这种体验,但在weblogic上我有。这可能是因为本地spring引导速度更快


关于如何避免这种情况,有什么想法吗?

问题是spring batch在每个块之后都会进行提交,提交会关闭事务,从而关闭结果集

当您不在应用程序容器中时,如使用spring boot时,*CursorItemReaders使用单独的连接绕过事务,从而避免关闭游标结果集的提交

另一方面,如果您在应用程序服务器上运行,则从服务器管理的数据源获得的连接在默认情况下将参与事务。为了使游标项读取器工作,必须设置不参与事务的数据源

或者,您也可以使用*PagingItemReader,它可以在单独的事务中读取每个区块的页面大小记录。这完全避免了关闭结果集的问题注意:如果基础表在块之间更改,结果可能不是您所期望的



[a] :

此后,我尝试了一个JdbcCursorItemReader,结果相同。一旦尝试移动光标,结果集就会关闭,并且失败。即使提交间隔为1。我怀疑步骤写入时结果集已关闭。我已尝试使用支持该功能的数据源将useSharedExtendedConnection设置为true。不走运。我在运行weblogic,我认为weblogic可能是问题所在
Caused by: java.sql.SQLException: Result set already closed
at weblogic.jdbc.wrapper.ResultSet.checkResultSet(ResultSet.java:144)
at weblogic.jdbc.wrapper.ResultSet.preInvocationHandler(ResultSet.java:93)