数据库 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左右,系统正常,问题解决。

 
 
 
 
PS:语句缓存的功能: 为提高性能,WebLogic Server 提供了一种功能,让您可以在使用连接池时将预处理语句和可调用语句载入缓存。当 WebLogic Server 将预处理语句或可调用语句载入缓存时,在许多情况下,DBMS 将为每个打开的语句都保留游标。

posted on 2010-05-18 16:52  gapcloud  阅读(4547)  评论(0编辑  收藏  举报

导航