数据库 ora-01000 错误之解决方法
数据库 ora-01000错误(打开游标数过大),系统使用2天左右后出现操作失败,系统无法使用,只能重启。重启后使用正常。
查看连接数据库的各个应用和每个应用打开的游标数:
select o.sid, osuser, machine, count(*) num_curs
from v$open_cursor o, v$session s
where user_name = 'HBGD'
and o.sid = s.sid
group by o.sid, osuser, machine
order by num_curs desc
分析
是工单的服务器打开的游标最大。
初步估计是工单导致连接数据库问题,查看数据库打开
游标数
select sum(c) from (
select SQL_TEXT, count(*) c
from v$open_cursor t
group by t.SQL_TEXT
order by 2 desc
)
结果达到5000多,而且数量一直增加。
分析过程:
1. 代码层面
寻找所有的代码里面可能出现的连接数据库未释放连接的代码,未找到
connection,statement 未关闭的情况;修改代码里面出现在for循环内部的
可能获得数据库连接的代码,如:
for(......){
......
this.getHibernateTemplate();
.......
}
修改后测试,游标仍然不释放。
查询数据库中打开游标数最大的 sql:
select SQL_TEXT, count(*) c
from v$open_cursor t
group by t.SQL_TEXT
order by 2 desc
找到该sql,并未发现连接数据库五释放的代码。
2. 存储过程
担心是工单里面的存储过程,在使用时未关闭游标,检查所有的存储过程,发现一个存储过程中,2个游标变量没有关闭,停止该存储过程,测试,游标仍然不释放。
3. 部署服务器
由于数据库连接是交给WebLogic来管理的,所以检查WebLogic的数据库连接池配置,发现语句缓存(statement
cache)设置过大,被设置为200,将此选项重新设置为5,测试,游标数骤减,达到180左右。
观察1天后,发现游标数一直维持在180左右,系统正常,问题解决。
![](http://hi.csdn.net/attachment/201005/18/0_12741729282kt3.gif)
PS:语句缓存的功能:
为提高性能,WebLogic Server 提供了一种功能,让您可以在使用连接池时将预处理语句和可调用语句载入缓存。当 WebLogic Server 将预处理语句或可调用语句载入缓存时,在许多情况下,DBMS 将为每个打开的语句都保留游标。