如果open_cursors设定为300
select MAX(A.VALUE) AS HIGHEST_OPEN_CUR,p.value as max_open_cur FROM V$SESSTAT A, V$STATNAME B, V$PARAMETER P
WHERE A.STATISTIC# = B.STATISTIC#
AND B.NAME = 'opened cursors current'
AND P.NAME = 'open_cursors'
GROUP BY P.VALUE;
的结果为29X
是否一到300就会发生ORA-O1000:m~imum open CUrsOrs exceeded 错误,还是会内部进行一些cursor的释放?
另外通过
SELECT A.VALUE, S.USERNAME, S.SID, S.SERIAL# ,b.name
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$open_cursor
where sid=上面的sid
的数量不一致的,是什么原因?
------解决方案--------------------
不一样吧,上面查询的是当前session打开的游标吧;
v$open_cursor这个包含当前session所有处于游标缓存中的游标吧,只要还没释放,关闭的应该也是包括在内的;
应该同一个sid下,第二个的数目要更大的。
------解决方案--------------------
1. 若超出open_cursors设置的值,会报错ora-01000
2. v$open_cursor中查询的是游标缓存,当前打开的游标要从V$SESSTAT来查。两边可能会不一致