Home  >  Article  >  Database  >  错误 ORA-01000: maximum open cursors exceeded Exception

错误 ORA-01000: maximum open cursors exceeded Exception

WBOY
WBOYOriginal
2016-06-07 17:34:561461browse

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 

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn