【发布时间】:2011-12-22 04:01:39
【问题描述】:
我们有一个 Java 类,它遍历包含 Store 信息的结果集,然后开始为每个相应的 Store 处理 ascii 文件。每个商店处理 ascii 文件大约需要 5 分钟。我们遇到的问题是在它处理了第一个商店的 ascii 文件然后获取下一个结果集之后,我们得到一个 SQLException 说“DSRA9110E: ResultSet is closed”。
我们的代码基本上是这样的。
private void startProcess() throws Exception {
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = conn.prepareStatement("SELECT STORE_CODE FROM STORE");
rs = pstmt.executeQuery();
while (rs != null && rs.next()) {
System.out.println("Processing store " + rs.getString("STORE_CODE"));
try {
processStoreSalesFile();
} catch (Exception e) {
conn.rollBack();
e.printStackTrace();
}
if (rs != null) {
System.out.println("ResultSet is not null");
}
}
} finally {
if (rs != null) {
rs.close();
rs = null;
}
if (pstmt != null) {
pstmt.close();
pstmt = null;
}
}
}
当错误发生时,我确实看到系统打印行“ResultSet is not null”。但是当它得到下一个 ResultSet 时,它说 ResultSet 已关闭。
我尝试注释掉调用 processStoreSalesFile() 的代码,但我们没有收到此错误,它能够获取下一个 ResultSet 而不会引发任何异常。
我尝试的下一个尝试是取消对方法 processStoreSalesFile() 的调用的注释,然后从文件系统中删除所有 ascii 文件,这样程序就没有什么要处理的了。也没有抛出异常。
我们的设置是 WebSphere-Informix。我们有另一个设置 WebSphere-Oracle,没有任何问题。
我怀疑是 ResultSet 已超时,或者它只是不想等待进程完成并自行关闭。
更新 1: 在 processStoreSalesFile() 方法中,有一个 conn.commit() 调用来提交记录。是在调用提交时,ResultSet 将被关闭吗?在 WAS 管理控制台中,我已经添加了值为“1”的数据源属性 resultSetHoldability。但是 ResultSet 仍然是关闭的。
我希望有人可以在这里帮助我:(
谢谢。
【问题讨论】: