(03)开发之游标顾头不顾尾
原创
©著作权归作者所有:来自51CTO博客作者xcltapestry2的原创作品,请联系作者获取转载授权,否则将追究法律责任
不知有人碰到过这种情况没,程序运行一段时间后,报ORA-01000: 超出打开游标的最大数。
这种情况很大可能是开发在写程序时,对游标误用或没有注意引起。
游标要记得即时关闭。
另一种比较小的可能性是资源释放没有问题,确实是数据库的最大游标数太小了.
具体分析下.
--查看库中每个session可打开的最大游标数
show parameter open_cursors;
--PL/SQL 游标高速缓存
--高速缓存可以避免用户再次执行语句时重新进行语法分析。这个值设置得足够高, 可以防止应用程序耗尽打开的游标。
show parameter session_cached_cursors;
-- 输入指定用户名查询,要查全部可输入'%'
select o.sid, s.osuser, s.machine, count(*) num_curs
from v$open_cursor o, v$session s
where o.sid=s.sid
and o.user_name like '&1'
group by o.sid, osuser, machine
order by num_curs desc;
3. 对怀疑的sid查看其具体的sql情况
select o.sid,q.sql_text
from v$open_cursor o, v$sql q
where q.hash_value =o.hash_value
and o.sid = 158;
上面是分步说明,为了省事,下面把它们合成一条语句了.
with cso as
( select o.sid, s.osuser, s.machine, count(*) num_curs
from v$open_cursor o, v$session s
where o.sid=s.sid
and o.user_name like '&1'
group by o.sid, osuser, machine
)
select o.sid,q.sql_text
from v$open_cursor o, v$sql q
where q.hash_value=o.hash_value and o.sid = (
select sid from cso where num_curs =
(select max(num_curs) from cso)
) ;
解决方法:
如确实是数据库的session最大游标数太小了
--1.加大open_cursors参数
alter system set open_cursors=1000 scope=both;
--2.加大标高速缓存数
alter session set session_cached_cursors=100;
-- 附上一条sql,可查指定sid的当前游标参数使用情况
select sid,n.name,s.value used
from
sys.v_$statname n,
sys.v_$sesstat s
where s.statistic# = n.statistic#
and n.name in ('opened cursors current', 'session cursor cache count')
and sid= sid号
如由程序引起. 由具体sql排查相关程序,找到责任人,小小K他一顿. 嘿嘿.