[JDBC]ORA-01000: 超出打开游标的最大数(ORA-01000: maximum open cursors exceeded)
问题产生的原因:
Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,相当于在数据库中打开了一个cursor。由于oracle对打开的游标的数量做了限制,如果你的createStatement和prepareStatement是在一个循环里面,并且没有及时关闭的话,就会非常容易出现这个问题。
所以,“超出打开游标的最大数”这个异常通常是由于我们没有及时关闭statement造成的。因此,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,并且一定要及时关闭。
查看数据库最大游标数: show parameter open_cursors; 默认为300;
查看打开游标的视图: select * from v$open_cursor where user_name = 'xxxx';
可通过SQL_TEXT字段来定位是那个SQL导致的游标打开过多。
查看打开游标的来源: select o.sid, osuser, machine, count(*) num_curs from v$open_cursor o, v$session s
where user_name = 'xxxx' and o.sid=s.sid group by o.sid, osuser, machine order by num_curs desc;
查看没有被释放的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 = xxx;
修改最大游标数: alter system set open_cursors = 308 scope = both;
对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。 所以一定要仔细检查代码,找到问题产生的原因并消除。