[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

               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并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。 所以一定要仔细检查代码,找到问题产生的原因并消除。

原文地址:https://www.cnblogs.com/jfqiu/p/3229699.html