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

来源:互联网 发布:ipadmini2怎么信任软件 编辑:程序博客网 时间:2024/05/16 04:38
最近项目中报错:
   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();方法即可
1 0
原创粉丝点击