最近项目中报错:
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();方法即可
分享到:
相关推荐
本文对ORA-01000_maximum_open_cursors_exceeded_超出打开游标的最大数的原因和解决方案有详细描述
解决疑难问题,针对偏僻的问题:oracle超出打开游标的最大数的原因和解决方案,希望能对大家操作数据库有用处
本文实例讲述了Oracle出现超出打开游标最大数的解决方法。分享给大家供大家参考,具体如下: Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。...
详细介绍游标的创建,使用。里面有详细的例子,是见过的所有学习游标和过程最好的接招
1,异常处理,事务回滚。 2,错误消息返回。 3,游标嵌套。 4,对于嵌套游标STATUS的互相影响问题的解决办法《注意001和002的注释位置,fetch的位置》。 对于初学者,存储过程重要的几个方面,都有展示到,大虾们请...
oracle游标和异常处理、函数、存储过程和包的说明 并带有实际操作的语句
很好的异常的游标处理方法,整理出来了,比较详细,经供参考
NULL 博文链接:https://sunny-java-163-com.iteye.com/blog/661283
福建省电力公司oracle培训教材--PLSQL之游标与异常处理
3.获取打开的游标数 select o.sid, osuser, machine, count(*) num_curs from v$open_cursor o, v$session s where user_name = 'AF651_U8' and o.sid = s.sid group by o.sid, osuser, machine order b
labview波形图-游标动态坐标实时显示最大值与最小值
NULL 博文链接:https://susteven.iteye.com/blog/1536079
游标和异常处理 oracle
SQL Server对游标的使用要遵循:声明游标–打开游标–读取数据–关闭游标–删除游标。下面让我们来看看几种常用游标是怎么使用的! 1、只读游标的使用(只能使用next提取数据) --声明一个只读游标 declare cur_stu ...
Ø 事务 在数据库中有时候需要把多个步骤的指令当作一个整体来运行,这个整体要么全部成功,要么全部失败,这就需要用到事务。 1、 事务的特点 事务有若干条T-SQL指令组成,并且所有的指令昨晚一个整体提交给...
游标和异常处理oracle.doc
7.1 游标的概念 7.2 隐式游标 7.3 显式游标 7.4 异常处理
显式游标的用法 声明游标 CURSOR 游标名 IS SELECT语句FROM语句; 打开游标 OPEN 游标名; 提取游标 FETCH 游标名 INTO 变量列表; 关闭游标 CLOSE 游标名; 完整示例