Oracle11g 如何更新ORA-01000的游标限制:最大打开游标超过

Oracle11g 如何更新ORA-01000的游标限制:最大打开游标超过,oracle11g,Oracle11g,通过以下查询,我发现每个数据库的最大游标数为300: 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' gr

通过以下查询,我发现每个数据库的最大游标数为300:

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;
我尝试使用以下命令将金额更新为1000:

  update v_$parameter
  set value = 1000
  where name = 'open_cursors';
但我看到了这个错误:

SQL Error: ORA-02030: can only select from fixed tables/views
02030. 00000 -  "can only select from fixed tables/views"
*Cause:    An attempt is being made to perform an operation other than
           a retrieval from a fixed table/view.
*Action:   You may only select rows from fixed tables/views.

更新open_光标值的正确方法是什么?谢谢。

假设您正在使用spfile启动数据库

alter system set open_cursors = 1000 scope=both;
如果改用pfile,则可以更改正在运行的实例的设置

alter system set open_cursors = 1000 
然后还需要编辑参数文件以指定新的
open\u游标设置。通常情况下,最好在此后不久重新启动数据库,以确保参数文件更改按预期工作(几个月后,下次重新启动数据库时,会发现一些没有人记得的参数文件更改没有正确执行,这非常烦人)


我还希望您能够确定,每个会话实际上需要300多个打开的游标。大多数情况下,调整此设置的人实际上会出现光标泄漏,他们只是试图掩盖错误,而不是解决根本原因。

您可以在中的init.ora下更新设置
oraclexe\app\oracle\product\11.2.0\server\config\scripts运行以下查询以查找是否正在运行spfile:

SELECT DECODE(value, NULL, 'PFILE', 'SPFILE') "Init File Type" 
       FROM sys.v_$parameter WHERE name = 'spfile';
如果结果为“SPFILE”,则使用以下命令:

alter system set open_cursors = 1000 ;
alter system set open_游标=4000范围=两者--4000是打开游标的数目

如果结果为“PFILE”,则使用以下命令:

alter system set open_cursors = 1000 ;
您可以在这里阅读有关SPFILE与PFILE的信息


每个连接的限制为300,而不是所有连接的上限。在大多数情况下,此错误消息表示应用程序中存在严重错误,因为它没有正确释放资源。您应该在应用程序中解决问题(根本原因),而不是对抗症状。谢谢。我把它提高到3k,但仍然超过了最大开放度。我没有显式地创建任何游标,因此我必须研究代码,了解它为什么会生成这么多游标。有几个准备好的语句和结果集同时打开,但它们最终都关闭了,所以我不认为这是一个漏洞。@yellavon-如果我们在谈论
PreparedStatement
ResultSet
对象时谈论Java应用程序,我很高兴地打赌,你不是每次都能正确地关闭所有东西。我敢打赌Java应用程序正在泄漏游标,您需要调试该问题。我相信一切都结束了,因为当我在较小的数据集上运行此方法时,它工作正常,并且在较小的数据集上打开游标的当前值前后相同。但是,我确实有嵌套的PreparedStatements:
ResultSet rs=ps.executeQuery();while(rs.next()){long seqNum=rs.getLong(1);ps1.setLong(1,seqNum);ps1.close;}ps.close对泄漏游标的良好调用:P代码正在重用
PreparedStatements
,因此很难判断发生了什么。创建一个
preparedstation
,用它生成一个
ResultSet
,关闭它,然后用完全不同的查询重新分配
PreparedStatement
,这是一个好主意吗?我只是这样做的,
prepareStatement()
方法只在
PreparedStatement
上调用了一次,所有
PreparedStatements
ResultSets
都被关闭了。最大值是多少?增加open\u游标是一个可怕的想法。我还没有看到一个实际需要300个开放游标的应用程序。通过增加值所做的只是延迟问题,而不是解决问题。几乎可以肯定是游标泄漏。@BobC如果我们讨论的是多个应用程序共享一个数据库实例,该怎么办?增加限额是有正当理由的。@charlie_pl Nope!这是一个每会话参数。@BobC显然您没有使用过ArcGIS.:)