Underlying DBMS error (ora_01000:打开的游标数超过可使用游标的最大数)

     在公司的工作过程中,同一段代码之前使用没有问题,但是过了一段时间出现了上述所说的错误,经过长时间的调试、上网查资料,最终得到解决,在这里把我处理的过程写出来,希望可以帮助遇到同样问题的人。
     本人新手,也是在网上搜索了大量的资料,如果有什么不对的地方,还请大神指教。

   首先声名一点:游标有显式游标和隐式游标,并不是没有显式的挪用游标就不会使用到游标,有些SQL语句是会挪用隐式游标的,这就是为什有些人没有显式的挪用游标却呈现了上述错误提醒。
     对于显式游标,我们在使用完成后释放就没有问题了,要注意在系统跳出异常的时候也要加上释放显式游标的语句。
     显示释放的方法为:System.Runtime.InteropServices.Marshal.ReleaseComObject(游标);

   对于隐式游标,呈现这种错误提醒大多是因为OracleConnection,OracleDataReader使用完后没有正常的关闭造成的。只要使用后当即关闭就可以了,即挪用响应的Close()事件。对于OracleDataReader来说必然要挪用Close()事件。

     下面我主要说一下我的想法,个人认为不管是显式或是隐式的导致游标超出最大使用数大部分原因都是因为代码书写不合理造成的,对于显式原因,通过代码进行释放,对于隐式原因,尽量通过代码解决。实在是代码没法解决的通过修改可用游标的最大数进行解决。

     我所用的是Oracle10g,游标最大值是300,保留在OracleProduct10.1.0AdminOrclPfile目录下的init.ora文件的open-cursors参数里。我们可以通过管理员的身份(sys)通过PLSQL登录到服务器上,通过执行Select * from v_$open_cursor where user_name='用户名',可以查看占用游标的情况(该用户未释放的游标以及该游标做负责的SQL语句),另外可以查看没有释放的游标的总数(select count(*) from v_$open_cursor where user_name='用户名'),与最大值相比就可知道是否超出可用游标的最大值。
     通过执行select value from v$parameter where name='open_cursors'查看服务器是支持的最大可用游标数。
     通过执行alter system set OPEN_CURSORS=指定数量(如1000)更改服务器是支持的最大可用游标数。(另外也可以通过修改init.ora文件修改服务器支持的最大可用游标数)  

     Alter语句后还可增加scope参数,该参数的含义为

          <1.scope=memory修改后当前就起作用,重启数据库不起作用

          <2.scope=spfile修改后当前不起作用,下次重启数据库才起作用

          <3.scope=both修改后当前起作用,下次重启数据库也起作用(默认值) 


原文地址:https://www.cnblogs.com/Jingkunliu/p/2452132.html