超出打开游标的最大数异常

最近项目中报错:

java.sql.SQLException: ORA-01000: maximum open cursors exceeded
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedSt
即:打开的游标超出了游标的最大数:
分析:在这个业务中一次处理数据为1000条,通过命令:show parameter open_cursor;查看游标数量为3000,在这种情况下测试没问题;
修改游标数量为100,alter system set open_cursors=100;再测测试出现上述问题;经跟踪代码发现在程序
com.asiainfo.boss.so.ams.exe.ServiceTemp.serviceTemp(HashMap[])中端类似于下面的代码:
for (int i = 0; i < maps.length; i++){
pstmt = conn.prepareStatement(sql_up.toString());
*****
pstmt.execute();
}
在这种情况下游标不停的打开而没有关闭,当循环次数足够大时就会出现上面的错误。

解决方法:
1、增大游标的数量(不可取)
分析:
1.1、显然这种方法治标不治本,游标的数量往往设置一个 较小值即可,除非特殊情况;
1.2、应用程序不同,该值也不同
1.3、并么有根除代码上的缺陷
2、修改代码:
Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor,
当PreparedStatement或statement执行操作之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。
尤其是在循环中,因为游标一直在不停的打开,而且没有关闭;
综上所述:上面的代码在pstmt.execute();之后执行pstmt.close();方法即可

你可能感兴趣的:(超出打开游标的最大数异常)