Partitioned Chunk Step,只有第一个分区成功运行,其他分区显示ResultSet已关闭Error

时间:2016-05-05 11:44:57

标签: db2 jsr352 java-batch

我正在从DB2表中读取数据并将其转储到文件中。我正在根据列中的值对步骤进行分区。那就是 column1值为" XYZ"它将进入一个分区,如果column1值为" ABC"它会进入另一个。

问题是第一个分区正确执行,数据写入文件,但对于第二个分区,我得到" ResultSet已关闭"错误。因此产生了2个线程,并且执行了两次查询。我得到2个不同的结果集;但是只有一个ResultSet被迭代,另一个线程会给出错误。

2 个答案:

答案 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.ResultSetResultSet是事务性的,并且与创建它的线程和事务相关联。对于其他类型的JDBC资源(语句和连接)也是如此。应该跨线程共享的唯一JDBC资源是DataSource。您还需要确保关闭Connections。在某些情况下,WebSphere Application Server可能能够为您关闭它们,我希望这里发生的事情会导致&#34; ResultSet关闭&#34;错误,但最好的做法是在完成JDBC资源后立即关闭它们,并且永远不要跨线程缓存它们。在这种情况下,您需要每次都获得连接并执行查询。应用程序服务器将通过汇集Connection并缓存PreparedStatement来提供帮助。您每次都会有重新执行查询的开销,但没有办法解决这个问题。