加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle ORA-01000: maximum open cursors exceeded问题的解决方

发布时间:2020-12-12 14:57:54 所属栏目:百科 来源:网络整理
导读:From:http://www.jb51.cc/article/p-sevqsxjk-kg.html 项目在运行过程中,后台报错: Java代码 ORA- 01000 :maximumopencursorsexceeded 00604 :erroroccurredatrecursiveSQLlevel 1 01000 :maximumopencursorsexceeded 网上搜索了一下,找到了原因根源: 使

From:http://www.52php.cn/article/p-sevqsxjk-kg.html

项目在运行过程中,后台报错:

Java代码
  1. ORA-01000:maximumopencursorsexceeded
  2. 00604:erroroccurredatrecursiveSQLlevel1
  3. 01000:maximumopencursorsexceeded

网上搜索了一下,找到了原因根源:

使用Oracle数据库的时候,经常会碰到有ORA-01000: maximum open cursors exceeded的错误。实际上,这个错误的原因,主要还是代码问题引起的。ora-01000: maximum open cursors exceeded:表示已经达到一个进程打开的最大游标数。这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。其它语言的 操作类似关闭连接。

一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭。

对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。

而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。

解决方案

一、从源头上解决方案(建议)

检查代码,把涉及到打开链接的地方,用完之后,千万别忘记关掉。

二、临时解决方案(不已建议)

通过修改oracle系统参数:将OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值), 也不会增加系统开销。

步骤如下:

第一步:查看当前OPEN_CURSORS的值

Sql代码
    showparameteropen_cursors;

第二步:查看修改之后是重启oracle服务生效还是立即生效

showparameterspfile;

多说一点在修改系统参数时,scope有三个重要参数,如下:

altersystemsetparameter=valuescope=spfile;

**SCOPE=MEMORY:只改变当前实例运行,亦即初始化参数改变了只对当前实例有效,当实例重启之后,初始化参数值还原。

**SCOPE=SPFILE:只改变SPFILE的设置。亦即改变初始化参数文件内容。实例重启后参数生效。

** SCOPE=BOTH,既改变实例也改变SPFILE。指定这个选项相当于不带参数的alter system语句。需要注意的是,如果修改静态参数,必须指定SPFILE参数(必须表明SCOPE=MEMOEY或者SCOPE=SPFILE),否则会报错。

如何查看scope设置的是上面参数中的值,则通过:show parameter spfile;如下


第二步:修改游标:open_cursors的值

setOPEN_CURSORS=1200;

因时间关系,写的有点乱。

另外,oracle中还有几个重要的值:分别为:sessions,processes;通过如下命令看查看当前值:

showparametersessions;

  • showparameterprocesses;
  • 修改的话,通过如下命令:

    setsessions=value;

  • setprocesses=value;
  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读