欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle——ORA-01000错误,游标的问题

程序员文章站 2024-03-20 10:33:12
...

Oracle——游标的问题

1.命令窗口

–查看游标个数Oracle——ORA-01000错误,游标的问题

PLSQL > 新建命令窗口

		  SQL> show parameter open_cursors;
–新增游标数量,一般不采用

若数据库设置游标数太少,可直接修改open_cursors,一般不采用

SQL> alter system set open_cursors=1000;

系统已更改。

SQL> commit;

提交完成。

SQL> show parameter open_cursors;

NAME                               TYPE        VALUE
---------------------------------- ---------- -------------
open_cursors                       integer     1000

2.sql窗口查看

PLSQL >新建sql窗口

(1)查看游标个数
select value from v$parameter where name = 'open_cursors';
(2)查看用户名和用户SID
SELECT a.value, s.username, s.sid, s.serial# 
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' 
AND s.username IS NOT NULL 
ORDER BY 1 DESC;
(3)查看正在打开的游标数
select o.sid, osuser, machine, count(*) num_curs
from v$open_cursor o, v$session s
where user_name = '用户名' and o.sid=s.sid
group by o.sid, osuser, machine
order by  num_curs desc;

注意:用户名 修改成你要查的用户名,注意大小写,根据(2)查出用户名查询

(4)查看打开游标最多的SQL语句
SELECT s.machine, oc.user_name, oc.sql_text, count(1)
  FROM v$open_cursor oc, v$session s
 WHERE oc.sid = s.sid
   AND user_name != 'SYS'
 GROUP BY user_name, sql_text, machine
HAVING COUNT(1) > 5
 ORDER BY count(1) DESC;
(5)查看统计信息中的游标打开的最大值
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;

4.Java代码中出现ORA-01000错误的原因

这样的错误出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的 createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。
一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些 Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。
对于出现ORA-01000错误这种情况, 请务必检查代码中的隐患,进行修改
如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。
但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和 ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

相关标签: 游标 oracle