首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找和关闭新打开的馆长-甲骨文

问查找和关闭新打开的馆长-甲骨文
EN

Stack Overflow用户
提问于 2018-09-12 08:01:19
回答 1查看 192关注 0票数 1

我正在使用Matlab2018a通过JDBC连接到Oracle DB。oracle版本为11.2。

我的程序是一个“引擎”,它激活了一系列用户编写的函数。

如果函数的数量很大,我可能会得到一个"ORA-01000最大打开游标超出“错误。

目前,我正在通过关闭和打开DB连接来处理这个问题,但是这对性能来说是一个很大的挫折。

我想要做的是在函数之前和之后获得游标表,然后关闭我运行的函数打开的游标。

因此,我提取了V$SESSION和V$OPEN_CURSORS表,并被告知从我的会话中找到了一群打开的馆长。

我没有显式地打开游标,我运行的函数也没有显式打开游标,但是我们使用的是执行SQL查询的函数。

所以:

  1. 我如何知道哪个游标是由我运行的函数打开的?游标是否有我应该用来区分它们的唯一I?
  2. 我应该只看开游标,还是也应该担心闭游标?它们会突然变成开放游标吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-09-12 09:24:53

我如何知道哪个游标是由我运行的函数打开的?

下面的查询将告诉您什么是打开的游标(您可以指定username)

代码语言:javascript
复制
select a.value, s.username, s.sid, s.serial#    
from v$sesstat a, v$statname b, v$session s    
where a.statistic# = b.statistic#  and s.sid=a.sid    
and b.name = 'opened cursors current';

然后从sid中您可以知道查询。

代码语言:javascript
复制
select * from v$sqlarea where sql_id in(
select case when sql_id is null then prev_sql_id else sql_id end  from v$session where sid in (
select  s.sid
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic#  and s.sid=a.sid
and b.name = 'opened cursors current'
and username='usersomething')
)

游标是否有我应该用来区分它们的唯一I?

在执行select时,打开游标时,上面的查询将告诉您哪些查询打开了游标。有两种类型的游标隐式游标和显式游标,通过运行select 1从dual这是一个隐式游标打开和关闭它,显式是当您声明一个游标(用select)打开和关闭(好吧,如果您使用for .. in ..loop它会自己关闭它)

(根据我的理解和我所做的一些测试,当您关闭连接oracle时,将关闭游标)

我应该只看开游标还是也应该担心闭合游标?它们会突然变成开放游标吗?

上述错误限制与打开游标有关,在再次执行查询时可以打开游标。所以你得检查一下打开的游标。

您可以通过增加游标ORA-01000 maximum open cursors exceeded的数量传递此错误alter system set open_cursors = 400 scope=both (默认情况下,它似乎是50 https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams138.htm#REFRN10137 )。

这个答案很好地解释了ORA-01000: maximum open cursors exceeded背后的原因以及解决这个问题的方法。java.sql.SQLException:- ORA-01000:超出最大打开游标

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52290280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档