暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
【生产排故】_ORA-01000 maximum open cursors exceeded
1038
5页
5次
2019-11-07
5墨值下载
【引言】
项目组今天来找,反馈应用程序日志记录了一连接在昨晚发生连接中断现象,让查一查数据库端有何异常
对应昨晚异常发生时间点,在库

日志中找到相应时间段的报错信息,报错信息如下:
【报错信息】

 !!"#$% &&'() %*+,(, ,
-./0'! +1!23%45!1%
!6788658658#"!89#89#889#..:;266<(==,3
>' ?(,,=  1  1" /0'! +1!23% %  &&'() %
*+,(, ,% !!"#$%%
>' ?,11!6@A
ORA-01000: maximum open cursors exceeded
6 6! 6
88658658#"!89#89#866866.(==,89#..:.6(==,;
B! &'+1/#9/5966;
,;C>1D/5656!;
问题现象也很明显:见上述

日志报错“
>' ?"6"1"1!!
原因分析
>
使
>*.+B'>'
数指
session
话一最多开的数。过此时,
>
将报
>' ?
错误。当此错误反应在
#A56
时,显示为抛出
@A
之前的一篇微信推文
《排故篇:
ADG
实例被
LGWR
进程宕掉?!》介绍过
1!
【分析过程】
;
查询数据库定义的单个
session
可以打开游标的最大数
EF9#G!9H".1!!
 CIE*
?????????????????????????????????????????????????????????????????????
AB
??????????????????????????????
.1!!65

Oracle
OPEN_CURSORS 缺省值为 50
OPEN_CURSORS 的值设置得足够大,以避免应用程
用尽所有打开的游标。
注意:
应用程序不同,
调用
cursor
数也不同
单个
session
实际打开的
游标数未达 OPEN_CURSORS 指定的数
量,也不会增加
内存
开销。
2. 显示
特定
用户为每个会话打开的游标数
C +JD"=
>B'D"=
!6!6K
!;!6!1!"9612L31".1!
D"-.1!-!!!6!
H91!."<MUSERNAMEM;!6<!;!6
51#;!6!1!"96
#1".1!!N
此查询中的
MUSERNAMEM
应为用于创建连接池的用户。
提醒:
-.1!
可以跟踪会话中
* '&
>I+A>&
的动态游标(使用
#"!.!0;.1!23
打开的
标)。但不会跟踪未经分析(但已打开)的动态游标。在应用程序中使用动态游标并不常见。
3. 获取为游标执行的 SQL
使用在以上查询结果中找到的
&
运行下面的查询,将显示哪些
!0
正在连接执行。
SQL> select q.sql_text
2 from v$open_cursor o, v$sql q
3 where q.hash_value=o.hash_value and o.sid = SID;
【解决方案】
大致为两种方式。
方式

:首先恢复应用,调大参数
open_cursors
,该参数为动态参数,可立刻生效。
sql > alter system set open_cursors=3000 scope=both;
注意:
如果应用程序使用的是
"
,一定重启 下
"
否则修改不生效。
方式
2
:应用程序正确编码,调整应用代码
java
引用代码中
,
灭此执行
conn.createStatement()
conn.prepareStatement()
时,数据库中
打开了一
cursor
。如
createStatement
prepareStatement
是写在一
while
循环或者
for
循环
中,则非常容易导致单个
session
超出
open_cursors
值。因为游标一直在不停的打开,没有及时关闭。
通常
Java
代码时,
createStatement
prepareStatement
应放在循环外,且应及时关闭。建议每
executeQuery
executeUpdate
使
ResultSet
close()
方法进行关闭。
根据
JDBC
规范,关闭
Connection
时正常情况下也会
Statement
ResultSet
关闭,但好的做法
是:如果在一个
Connection
对象上创建了多个
Statement
,则在使用完
Statement
ResultSet
Statement
ResultSet
of 5
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜