视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
错误ORA-01000:maximumopencursorsexceededException
2020-11-09 10:31:05 责编:小采
文档


ORA-01000是开发中常见的异常。这个异常表示程序中打开的游标数目gt; 数据库中设定的可以打开的最大游标数。

ORA-01000是开发中常见的异常。这个异常表示程序中打开的游标数目> 数据库中设定的可以打开的最大游标数。

这个异常通常由2个原因导致

1. 数据库中设置的maximum open cursors太小

2. 在 Java JDBC程序中通常是代码中打开的ResultSet 或 PreparedStatment 没有被关闭。

什么是游标

游标就是看成是指向结果集的指针。可以把它看成一种资源,或者一种数据结构。


查看系统中允许的最大游标数和 历史上打开的最大游标数

select max(a.value) as highest_open_cur, p.value as max_open_cur
from v$sesstat a, v$statname b, v$parameter p
where a.statistic# = b.statistic# and b.name = 'opened cursors current' and p.name= 'open_cursors'
group by p.value;

HIGHEST_OPEN_CUR MAX_OPEN_CUR

---------------- ------------

69 300


从结果可以看出,,系统允许的最大游标数是300, 历史上最大打开游标数是30, 可以得出结论300 够用了。如果两个数字很接近或相等,那么就要修改最大允许游标数了。

查看时谁在适用游标


select sum(a.value) total_cur, avg(a.value) avg_cur,

max(a.value) max_cur, s.username, s.machine

from v$sesstat a, v$statname b, v$session s

where a.statistic# = b.statistic# and s.sid=a.sid

and b.name = 'opened cursors current'

group by s.username, s.machine order by 1 desc


TOTAL_CUR AVG_CUR MAX_CUR USERNAME MACHINE

--------- ------- ------- -------- -------

114 14.25 69 A KUL-0121

76 8.44 48 B KUL-0121

29 1.38 18 KUL-0121
26 8.67 13 C xxx\KUL-012



既然我们已经可以从系统中知道游标的适用情况,那么下面就要fix 这个异常。

1. 通过设置OPEN_CURSORS, MAX_VALUE增加最大游标数

ALTER SYSTEM SET OPEN_CURSORS = MAX_VALUE SID='*' SCOPE=BOTH;


2. 通常这个异常是由Java程序未关闭ResultSet 或者 PreparedStatment 造成的。正确的适用方法, 总是把close()放在finally中,这样不管有没有发生其他异常,都会关闭ResultSet 和 PreparedStatement.


Statement stmt = conn.createStatement();

try {

ResultSet rs = stmt.executeQuery( "SELECT FULL_NAME FROM EMP" );

try {

while ( rs.next() ) {

System.out.println( "Name: " + rs.getString("FULL_NAME") );

}

} finally {

try { rs.close(); } catch (Exception ignore) { }

}

} finally {

try { stmt.close(); } catch (Exception ignore) { }

}

相关阅读:

关于ORA-01000: maximum open cursors exceeded" 问题分析总结

关于Oracle游标的问题(ORA-01000: maximum open cursors exceeded)

Oracle ORA-01000:maximum open cursors exceeded

ORA-01000: maximum open cursors exceeded

下载本文
显示全文
专题