0

我在阅读器的打开中创建一个连接Connection con = ds.getConnection();(其中 ds 是数据源)并在阅读器的 close() 中关闭它。

但是当我运行具有多个分区的作业时,在作业中间,我得到连接已关闭错误

Caused by: java.sql.SQLException: [jcc][t4][10335][10366][3.58.82] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003 DSRA0010E: SQL State = 08003, Error Code = -4,470

我假设当其中一个分区完成时会发生这种情况。

所以我的问题是为什么会发生这种情况?以及应该如何处理连接?还是 Java 负责关闭连接?

我在 WebSphere Liberty UPDATE 上使用 Java Batch:

<jdbcDriver libraryRef="DB2JCC4Lib"/>

<properties.db2.jcc databaseName="" driverType="4" password="" portNumber="" queryDataSize="65535" serverName="" user=""/>

</dataSource>




public class Reader implements ItemReader {
private DataSource ds = null;
private Connection con = null;
public Reader() {

}

public void close() {
    try {
        con.close();
        rs.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

/**
 * @see ItemReader#readItem()
 */
public Object readItem() {
    String s="";
    try {
    if (rs.next()) {
                for (int i = 1; i <= 10; i++) {
                    s+=rs.getString(i);                     
                }
                return s;
            }
         else {
            return null;
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}
public Serializable checkpointInfo() {

}

public void open(Serializable checkpoint) {

    if (ds == null) {
        try {
            ds = (DataSource) new InitialContext()
                    .lookup("java:comp/env/jdbc/dataSource");
        } catch (Exception e) {
        e.printStackTrace();
        }
    }

    try {
        con = ds.getConnection();
        statement= con
                .prepareCall("call abc.xyz(?)");
        statement.setString("param", "xxx");
        boolean result= statement.execute();
        if (result) {
            rs = statement.getResultSet();
            if (rs == null) {
                throw new NullPointerException();
            }               
        } else {
            throw new SQLException();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

}

完整的错误信息 [ERROR ] J2CA0024E: Method rollback, within transaction branch ID {XidImpl: formatId(57415344), gtrid_length(36), bqual_length(40), data(0000015645eff4470000000915937ff85f46c3ed056b19010aa5147e1183f8d3ae81c04c0000015645eff4470000000915937ff85f46c3ed056b19010aa5147e1183f8d3ae81c04c00000001)} of resource pool connectionManager[Pool], caught com.ibm.ws.exception.WsException: DSRA0080E: An exception was received by the Data Store Adapter. See original exception message: [jcc][t4][10335][10366][3.58.82] Invalid operation: Connection is closed. ERRORCODE=-4470, SQLSTATE=08003. with SQL State : 08003 SQL Code : -4470

4

1 回答 1

0

我不知道 JSR-352 的 Batch 处理处理的方式是否与 Spring Batch 完全相同,但是......

在 Spring Batch 中,如果您有一个使用块处理的阅读器,我认为您可以解决问题的方法是openConnection()beforeRead()closeConnection()afterRead()

为此,您应该实现一个侦听器。检查这些,以便您了解我在说什么。

Spring 注解类型 BeforeRead

接口 ItemReadListener

于 2016-07-22T13:33:41.350 回答