Oracle——ORA-01000错误,游标的问题
程序员文章站
2024-03-20 10:33:12
...
Oracle——游标的问题
1.命令窗口
–查看游标个数
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——ORA-01000错误,游标的问题
-
QUESTIONS 博客分类: 数据库 oracle问题错误
-
QUESTIONS 博客分类: 数据库 oracle问题错误
-
关于Oracle游标的问题(ORA-01000: maximum open cursors exceeded)
-
Oracle读取数据错误和hibernate几个问题
-
2008年Oracle错误、备份、升级等最热门问题
-
解决python3捕获cx_oracle抛出的异常错误问题
-
Oracle数据库中六种TNS:协议适配器错误问题的解决方法
-
oracle数据库下五种解决ORA-04031错误问题的方法
-
Oracle ORA 07445 evaopn2()+128错误问题的解决方案