oracle - 打开光标问题
问题描述
我们已将打开的游标 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 条语句,它似乎也使打开游标的数量猛增。当我完全关闭语句缓存时,我看到生成的游标数量非常可管理。也许这是驱动程序中的一个错误,因为它创建的游标比我在语句缓存中的游标多。