1

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

我在块侦听器的 beforeChunk() 中执行我的简单选择查询,并使用步骤上下文在 itemreader 中获取它。

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

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

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

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

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

4

1 回答 1

1

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

如果您遵循此示例,您将看到它使用较旧的部署描述符 XML 文件。您可以编辑 batch-bonuspayout-application/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。

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

<connectionManager ...  enableSharingForDirectLookups="false"/>
于 2016-05-03T15:10:52.297 回答