首页 > 解决方案 > 打开光标问题

问题描述

我们已将打开的游标 SCOPE = both 设置为 1000。我们有一个可能有 20-25 个用户全天登录的金融应用程序,它连接到 Oracle 19c 数据库。在应用程序中,我们偶尔会看到 ORA-01000 Open Cursors limit exceeded 错误。

但是,当我们查看当前使用此查询的打开游标时,我们看不到任何接近 1000 的单个会话。这是我为此运行的查询:

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' 
and s.username is not null;

但是,总的来说,我们将看到 v$open_cursors 视图中的所有项目都超过 1000。

select Count(*)
from v$open_cursor 
where user_name IS NOT NULL;

看起来在 SYS 下打开了 600 多个游标,我假设其中许多是后台进程。它们在 cursor_type OPEN_RECURSIVE 或类似的东西下保持打开状态。

综上所述,似乎没有单个会话接近我们的 1000 限制,但似乎我们集体确实接近 1000。这是设置 OPEN CURSORS 限制的正确方法,以便没有一个会话获得到1000?为 SCOPE=both 设置此设置有什么作用?谢谢!

这个不是我创建的应用程序在关闭记录集和其他资源方面做得很差。我确信有些问题与此有关。

更新:此问题发生在我将此应用程序从 Microsoft ODBC 驱动程序迁移到 Oracle ODBC 驱动程序后。Microsoft 驱动程序似乎以不同的方式处理光标。此应用程序在关闭资源方面做得很差,但我无权进行所有必要的更改,因为它在整个系统中普遍存在。微软将在未来的任何时候拔掉 Microsoft ODBC 驱动程序的插件,他们建议立即停止使用它。

进一步更新:我今天一直在使用各种 Oracle ODBC 驱动程序设置,发现 Statement Cache 设置以负面的方式影响了打开的游标。即使有 20 条语句,它似乎也使打开游标的数量猛增。当我完全关闭语句缓存时,我看到生成的游标数量非常可管理。也许这是驱动程序中的一个错误,因为它创建的游标比我在语句缓存中的游标多。

标签: oracleoracle19c

解决方案


推荐阅读