查找并关闭新近打开的光标-甲骨文

时间:2018-09-12 08:01:20

标签: oracle matlab jdbc cursors

我正在使用Matlab 2018a通过JDBC连接到Oracle DB。 oracle版本是11.2。

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

如果函数数量很大,我可能会收到“超过ORA-01000最大打开游标”错误。

当前,我正在通过关闭和打开数据库连接来解决此问题,但这是性能上的重大挫折。

我想做的是在该函数之前和之后获取cursers表,并仅关闭由我运行的函数打开的游标。

因此,我提取了V $ SESSION和V $ OPEN_CURSORS表,很惊讶地从我的会话中找到了一堆开放的光标。

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

所以:

  1. 我怎么知道我运行的函数打开了哪些游标?游标是否具有我应该用来区分它们的唯一ID?
  2. 我应该只查看打开的游标还是应该担心关闭的游标?它们会突然变成游标吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

  

我怎么知道我运行的函数打开了哪些游标?

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

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中可以知道查询。

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')
)
  

光标具有唯一的ID,我应该使用它们来区分它们吗?

当执行选择时,会打开一个游标,上面的查询将告诉您哪些查询已打开游标。 游标有2种类型:隐式游标和显式游标,通过从双重运行选择1来使oracle打开和关闭该隐式游标, 显式是当您声明要打开和关闭的游标(带有select)时(如果您使用for .. in ..loop,它将自行关闭)

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

  

2-我应该只看打开的游标还是应该担心   关于关闭的游标?它们会突然变成打开的游标吗?

以上与打开游标有关的错误限制,可以在再次执行查询时打开游标。因此您必须检查打开的游标。

您可以通过增加游标数来传递此错误ORA-01000 maximum open cursors exceeded  alter system set open_cursors = 400 scope=both (默认情况下,它似乎是50 oracle doc

此答案对ORA-01000: maximum open cursors exceeded背后的原因以及解决该问题的方法有很好的解释。 java.sql.SQLException: - ORA-01000: maximum open cursors exceeded