我们有一个Java类,它循环遍历包含Store信息的结果集,然后开始处理每个相应商店的ascii文件。对于每个要处理的商店,ascii文件大约需要5分钟。我们遇到的问题是在它处理第一个商店的ascii文件然后获取下一个结果集之后,我们得到一个SQLException,说“DSRA9110E:ResultSet已关闭”。
我们的代码基本上就是这样。
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不为空”。但是当它获得下一个ResultSet时,它表示ResultSet已关闭。
我试图注释掉调用processStoreSalesFile()的代码,但是我们没有得到这个错误,它能够获取下一个ResultSet而不会抛出任何异常。
我尝试的下一次尝试是取消对方法processStoreSalesFile()的调用,然后从文件系统中删除任何ascii文件,以便程序无需处理。并且也没有例外。
我们的设置是WebSphere-Informix。我们有另一个设置WebSphere-Oracle并且没有任何问题。
我怀疑的是ResultSet有timedout,或者它只是不想等待进程完成并自行关闭。
更新1: 在processStoreSalesFile()方法中,有一个conn.commit()调用来提交记录。是否在调用commit时,ResultSet将被关闭?在WAS管理控制台,我已经添加了值为'1'的数据源属性resultSetHoldability。但是ResultSet仍然关闭。
我希望有人可以帮助我:(
感谢。
答案 0 :(得分:2)
以下是我们所做的工作。最初,Websphere配置为使用Informix JDBC驱动程序作为其数据源,因为我们连接到Informix数据库。我们将其更改为使用DB2 JCC Driver(由IBM Informix技术支持提出),然后在数据源定制属性中,我们将'resultHoldability'值设置为'1'(HOLD_CURSORS_OVER_COMMIT)。重新运行程序,它设法循环遍历结果集中的所有结果。
答案 1 :(得分:1)
您可以使用pstmt.setQueryTimeout(秒)。确保oracle驱动程序支持此功能。更多细节 here