OPEN CURSOR的问题

[复制链接]
查看11 | 回复9 | 2012-7-12 18:47:29 | 显示全部楼层 |阅读模式
环境:
WINDOWS 2000 SERVER SP4 ORACLE9206, IIS 5.0,
应用程序用.net 开发
SQL> SHOW PARAMETER OPEN_CURSORS
NAME
TYPEVALUE
------------------------------------ ----------- ---------------------------
open_cursors
integer 800
SQL> SHOW PARAMETER PROCESS
NAME
TYPEVALUE
------------------------------------ ----------- ---------------------------
processes
integer 150
问题
应用程序只会一个数据库会话(SESSION),
今早出现 ORA-01000 maximum open cursors exceeded
查看v$open_cursor,发现该SESSION 确实有 800 至多。
alter system flush shared_pool 之后,也连接不上,最后只能重新启动 IIS。
但通过观察得知,平时里其实很多SQL语句都在发布后不久,
就被清除出共享池(v$open_cursor里一开始有,之后不久就不看到)
现想知道:在什么情况下,数据库会释放 CURSOR,如何解决该问题。
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
以前我也遇到过V$OPEN_CURSOR问题的困扰,SESSION断开,系统会自动释放V$OPEN_CURSOR,但是有时候我们使用连接池,SESSION常见不断,并且要重用,而且调用了大量存储过程的时候,往往V$OPEN_CURSOR中资源的不到释放,其实不要紧,把open_cursors 改成80000吧!
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
最初由 ZALBB 发布
[B]环境:
查看v$open_cursor,发现该SESSION 确实有 800 至多。
alter system flush shared_pool 之后,也连接不上,最后只能重新启动 IIS。
但通过观察得知,平时里其实很多SQL语句都在发布后不久,
就被清除出共享池(v$open_cursor里一开始有,之后不久就不看到)
现想知道:在什么情况下,数据库会释放 CURSOR,如何解决该问题。 [/B]

您的.net 程序对cursor 处理的有问题,open 的要close .(当然,这对ZALBB 来说可能是废话)
如果没close ,里面有个循环的话,很快就ORA-01000 了
alter system flush shared_pool不能解决cursor 泄漏问题的,因为该Session打开的Cursor 可能在 UGA/PGA 里
there is a shared SQL area in the SGA, an instantiation in the PGA, and a statement handle in the client environment. Each of these is called a "cursor" in various contexts. Your close call is closing one of the statement handles in your client environment (PL/SQL) but the corresponding instantiation in the PGA remains cached, which is what statistic# 3 is counting. If you were to set close_cached_open_cursors = TRUE and commit after the close call
BTW:ZALBB你老兄的问题总是值得看
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
通过上面那段英文也可以解释通为什么Client端要关闭Cursor,以及产生的ORA-01000 原因:
客户端如果不关闭的话,接下来会打开额外的新的Cursor,从Server的角度上上看,Client打开的越来越多
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
最初由 Fenng 发布
[B]
您的.net 程序对cursor 处理的有问题,open 的要close .(当然,这对ZALBB 来说可能是废话)
如果没close ,里面有个循环的话,很快就ORA-01000 了
alter system flush shared_pool不能解决cursor 泄漏问题的,因为该Session打开的Cursor 可能在 UGA/PGA 里

BTW:ZALBB你老兄的问题总是值得看 [/B]

UGA是什么的缩写,什么作用?
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
最初由 warehouse 发布
[B]
UGA是什么的缩写,什么作用? [/B]

UGA: User Global Area
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
多谢warehouse,FENNG兄捧场。
TO FENNG:
应用系统不是我开发的,我也没有参与,.NET我也不懂。
之前也出现过此情况,我也和开发的同事说明了,要他们
记住OPEN CURSOR的时候要记的关闭。我估计这一点他们
是很清楚的。另外,今早查看v$open_cursor的时候,我记得
里面的sql_text里的内容很多都是select语句。
我想,SELECT 语句不应该再CLOSE。
现在是不知道该如何去思考这个问题。
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
open cursor之後是一定要close的啊!
無論是select還是update/delete/insert
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
再不行的话,就将connection关闭一下,再连接.
回复

使用道具 举报

千问 | 2012-7-12 18:47:29 | 显示全部楼层
有些东西关不掉的,比如通过java调用存储工程,打开的cursor就是无法关掉的,除非你断开连接,当然我也不懂java , 以前我同事用java开发,经常遇到这样的问题!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行