我正在使用Matlab2018a通过JDBC连接到Oracle DB。oracle版本为11.2。
我的程序是一个“引擎”,它激活了一系列用户编写的函数。
如果函数的数量很大,我可能会得到一个"ORA-01000最大打开游标超出“错误。
目前,我正在通过关闭和打开DB连接来处理这个问题,但是这对性能来说是一个很大的挫折。
我想要做的是在函数之前和之后获得游标表,然后关闭我运行的函数打开的游标。
因此,我提取了V$SESSION和V$OPEN_CURSORS表,并被告知从我的会话中找到了一群打开的馆长。
我没有显式地打开游标,我运行的函数也没有显式打开游标,但是我们使用的是执行SQL查询的函数。
所以:
谢谢!
发布于 2018-09-12 09:24:53
我如何知道哪个游标是由我运行的函数打开的?
下面的查询将告诉您什么是打开的游标(您可以指定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')
)游标是否有我应该用来区分它们的唯一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:超出最大打开游标
https://stackoverflow.com/questions/52290280
复制相似问题