在(Liberty)批处理块步骤中,从步骤前面发出的数据库查询滚动浏览结果集时获取"ResultSet is closed"



我正在从DB2表中读取数据并将其转储到一个文件中。

我在chunk监听器的beforeChunk()中执行简单的select查询,并使用step上下文在itemreader中获取它。

在区块中,我将检查点策略设置为item,将itemcount设置为5。

输出是被反复读取和写入的前5条记录

在这个来自IBM站点的示例java批处理代码中,它们在查询中有开始和结束参数。

是否有必要在查询中包含开始和结束参数是否没有其他方法可以确保当再次运行查询时,它会一次又一次地读取下一个数据块,而不是同一个块

我在WebSphere Liberty 上使用IBM的JSR 352实现

尝试将数据源配置为使用不可共享连接

如果您遵循此示例,您将看到它使用了较旧的部署描述符XML文件。您可以编辑批处理bonusLayoutapplication/src/main/webapp/WEB-INF/WEB.xml以添加行:

<res-sharing-scope>Unshareable</res-sharing-scope>

所以你会有完整的:

<web-app id="BonusPayout" version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
  <display-name>BonusPayout</display-name>
  <description>This is the BonusPayout sample.</description>
  <resource-ref>
    <description>Bonus Payout DS</description>
    <res-ref-name>jdbc/BonusPayoutDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
  </resource-ref>
</web-app>

这也可以通过更新的@Resource注释来完成,但如果您已经切换到该注释,那么您也将知道如何在那里应用这一点。

有了这一更改,位于以下位置的现有JNDI查找:java:comp/env/jdbc/BonusPayoutDS现在将使用非共享连接,并且不会在每个区块事务结束时关闭ResultSet。

WebSphere Application Server传统文档中间接记录了这种行为。(我在Liberty文档中没有看到,在某些类似的情况下,Liberty中的行为基本相同,而Liberty没有单独记录主题。)这对批处理用户来说有点间接。此外,很难完全描述,因为正如文档所说,DB和JDBC提供者的具体行为各不相同。但这应该适用于DB2。

更新:在更新版本(自17.0.0.1起)的Liberty中,可以通过使用enableSharingForDirectLookups属性配置connectionManager来获得不可共享的连接,而无需使用资源引用,例如:

<connectionManager ...  enableSharingForDirectLookups="false"/>

相关内容

  • 没有找到相关文章

最新更新