ORA-01000: 超出打开游标的最大数 问题的分析和解决

来源:互联网 发布:01季后赛科比数据 编辑:程序博客网 时间:2024/04/29 15:29
ORA-01000: 超出打开游标的最大数 问题的分析和解决
 
最近项目中报错:
java.sql.SQLException: ORA-01000: 超出打开游标的最大数 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)

代码:
for (MzLoadAcctCodeInfoDto dto : list) {
logger.info(qrySqlSb.toString());
ps = conn.prepareStatement(qrySqlSb.toString());
PreparedStatementHelper.setParam(1, dto.getAcctId(), ps);
rs = ps.executeQuery();
while(rs.next()) {
dbloopOne = 1;
ps = conn.prepareStatement(insertSqlSb.toString());
PreparedStatementHelper.setParam(dbloopOne++, dto.getAgreementCode(), ps);
PreparedStatementHelper.setParam(dbloopOne++, dto.getPartnerCode(), ps);
PreparedStatementHelper.setParam(dbloopOne++, rs.getString(1), ps);
PreparedStatementHelper.setParam(dbloopOne++, rs.getString(2), ps);
ps.executeUpdate();

dbloopOne = 1;
ps = conn.prepareStatement(deleteSqlSb.toString());
PreparedStatementHelper.setParam(dbloopOne++, dto.getAgreementCode(), ps);
PreparedStatementHelper.setParam(dbloopOne++, dto.getPartnerCode(), ps);
PreparedStatementHelper.setParam(dbloopOne++, dto.getAccNbr(), ps);
ps.executeUpdate();

num++;
}
}
在java代码中,执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
     一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭,调用close()方法。
解决方法:
1、增大游标的数量(不可取)
分析:
1.1、显然这种方法治标不治本,游标的数量往往设置一个 较小值即可,除非特殊情况;
1.2、应用程序不同,该值也不同
1.3、并么有根除代码上的缺陷
2、修改代码:
Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor,
当PreparedStatement或statement执行操作之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。
尤其是在循环中,因为游标一直在不停的打开,而且没有关闭;
综上所述:上面的代码在pstmt.execute();之后执行pstmt.close();方法即可
0 0
原创粉丝点击