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

问题描述 投票:1回答:1

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

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

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.