【问题标题】:finding and closing newly opened cursers - oracle查找和关闭新打开的cursers - oracle
【发布时间】:2018-09-12 08:01:19
【问题描述】:

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

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

如果函数的数量很大,我可能会收到“ORA-01000 maximum open cursors exceeded”错误。

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

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

所以我提取了 V$SESSION 和 V$OPEN_CURSORS 表,惊讶地发现我的会话中有一堆打开的光标。

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

所以:

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

谢谢!

【问题讨论】:

  • 解决这个问题的正确方法是正确关闭代码中的所有StatementResultSet 实例。通常使用“尝试资源”块,或至少使用 finally 块。
  • 请发布minimal reproducible example 包括函数如何连接到数据库和运行查询的示例....尝试询问 Oracle 的内部表并找出您从中打开了哪些游标然后关闭它们是错误的做法。相反,您应该确保您的函数正在读取和关闭游标,如果您使用的是共享连接池,则将连接返回到池中。

标签: oracle matlab jdbc cursors


【解决方案1】:

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

下面的查询会告诉你什么是打开的游标(你可以指定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 种类型的游标隐式游标和显式游标,通过运行 select 1 from dual this 隐式游标,oracle 打开和关闭它, 明确的是当你声明一个游标(带选择)你打开和关闭(如果你使用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

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2019-05-16
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多