我正在使用Matlab 2018a通过JDBC连接到Oracle DB。 oracle版本是11.2。
我的程序是一个“引擎”,可以激活一系列用户编写的函数。
如果函数数量很大,我可能会收到“超过ORA-01000最大打开游标”错误。
当前,我正在通过关闭和打开数据库连接来解决此问题,但这是性能上的重大挫折。
我想做的是在该函数之前和之后获取cursers表,并仅关闭由我运行的函数打开的游标。
因此,我提取了V $ SESSION和V $ OPEN_CURSORS表,很惊讶地从我的会话中找到了一堆开放的光标。
我没有显式打开游标,运行的函数也没有显式打开游标,但是我们使用的是执行SQL查询的函数。
所以:
谢谢!
答案 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