我正在从DB2表中读取数据并将其转储到文件中。我正在根据列中的值对步骤进行分区。那就是 column1值为" XYZ"它将进入一个分区,如果column1值为" ABC"它会进入另一个。
问题是第一个分区正确执行,数据写入文件,但对于第二个分区,我得到" ResultSet已关闭"错误。因此产生了2个线程,并且执行了两次查询。我得到2个不同的结果集;但是只有一个ResultSet被迭代,另一个线程会给出错误。
答案 0 :(得分:0)
您在阅读器属性分支与分区计划属性 parameterForWhereClause 之间感到困惑,其值被替换为分支的每分区值。
这样的东西在JSL中可行:
<step id="StepID" start-limit="1">
<chunk checkpoint-policy="item" item-count="10">
<reader
ref="ReaderClass">
<properties >
<property name="parameterForWhereClause" value="#{partitionPlan['branch']}"/>
</properties>
</reader>
<writer
ref="WriterClass">
</writer>
</chunk>
<partition>
<plan partitions="2" threads="2">
<properties partition="0">
<property name="branch" value="XYZ"/>
</properties>
<properties partition="1">
<property name="branch" value="ABC"/>
</properties>
</plan>
</partition>
</step>
(我拿出了阶梯级属性,因为你并没有明白你真的在使用它。)
因此,理解这一点的方法是Java工件的属性名称(如果你有 @BatchProperty 而没有名称注释,它将成为字段名称value)将匹配JSL reader属性的名称。所以我将JSL阅读器属性的名称更改为 parameterForWhereClause 以匹配您的字段。
由于阅读器是一个分区级工件(对于分区步骤),它可以使用partitionPlan替换,这是我显示为读者提供 parameterForWhereClause 属性的值。 / p>
答案 1 :(得分:0)
发生错误是因为您无法跨多个线程重用java.sql.ResultSet
。 ResultSet
是事务性的,并且与创建它的线程和事务相关联。对于其他类型的JDBC资源(语句和连接)也是如此。应该跨线程共享的唯一JDBC资源是DataSource
。您还需要确保关闭Connections。在某些情况下,WebSphere Application Server可能能够为您关闭它们,我希望这里发生的事情会导致&#34; ResultSet关闭&#34;错误,但最好的做法是在完成JDBC资源后立即关闭它们,并且永远不要跨线程缓存它们。在这种情况下,您需要每次都获得连接并执行查询。应用程序服务器将通过汇集Connection
并缓存PreparedStatement
来提供帮助。您每次都会有重新执行查询的开销,但没有办法解决这个问题。