在(Liberty)批量块步骤中,获取" ResultSet已关闭"从步骤中先前发出的数据库查询滚动ResultSet时

时间:2016-04-29 09:56:55

标签: db2 websphere-liberty jsr352 java-batch

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

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

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

输出是前后读取和写入的前5条记录。

在这个sample java batch code from IBM's site中,他们在查询中有开始和结束参数。

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

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

1 个答案:

答案 0 :(得分: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传统文档中间接记录为here。 (我在Liberty文档中没有看到它,在某些情况下,Liberty中的行为基本相同,Liberty中没有单独记录主题。)它对批处理用户来说有点间接。此外,很难完全描述,因为正如文档所说,确切的行为因DB和JDBC提供商而异。但这应该适用于DB2。