`

java.sql.SQLException: ORA-01000: maximum open cursors exceeded

 
阅读更多

问题描述:
Oracle 使用 OPEN_CURSORS 参数指定一个会话一次最多可以打开的游标的数量。超过此数量时,Oracle 将报告 ORA-01000 错误。当此错误传到 DAO时,就会抛出 SQLException

先做程序review,查看是否有在loop中create statement,这个是最容易导致“ORA-01000”问题出现。
根据oracle文档,最大游标是针对per-session而言,每个session最多允许创建300个cursor。如果connection创建300个未关闭的statement,将导致“超出最多允许打开的游标数”错误出现。减少在程序中使用loop来超作statement的情况,如果使用,用好及时做close操作。在文件init.ora中的参数open_cursors = 300 # 允许打开的最大游标数。(好像可以设置对于同一个SQL,重用同一个游标的,不知道具体是哪个参数?好像是参数CURSOR_SHARING?[http://www.oracle.com.cn/onlinedoc/nav/initora.htm?remark=homepage#index-CUR])

以DBA身份进入数据库端,查看目前游标的实际情况

select o.sid, user_name, osuser, machine, count(*) num_curs
from v$open_cursor o, v$session s
where o.sid=s.sid
group by o.sid, user_name,osuser, machine
order by num_curs desc

--依据前面查训到的联机情况,依据SID近一部查询,再进一步做查询到底是哪些sql对游标占用具体情况
select q.sql_text
from v$open_cursor o, v$sql q
where q.hashvalue=o.hash_value and o.sid = SID

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics