关于ORA-01000: maximum open cursors exceeded 在Websphere里

本文介绍ORA-01000错误的原因及排查步骤,包括检查数据库参数open_cursors设置、查找占用资源较多的会话,并提供SQL查询帮助定位问题源头。
网上有很多,这边备忘一下。

ORA-01000
这个参数决定一个SESSION的最大打开CURSOR的个数.
可能是异常中断而没有CLOSE,或程序写嘚有问题,或者确实有这么多的CUSOR同时在应用.
 
首先查DB的参数,
       select value
     from v$parameter
     where name = 'open_cursors'
    建议大应用至少1000 .
 
然后,查
           select o.sid, osuser, machine, count(*) num_curs
     from v$open_cursor o, v$session s
     where user_name = 'username' and o.sid=s.sid
     group by o.sid, osuser, machine
     order by num_curs desc;
 
里面肯定有接近 'open_cursors' 的 session , 得到SID.
最后,查看是这些'open_cursors' 都是哪些SQL.
           select q.sql_text
     from v$open_cursor o, v$sql q
     where q.hash_value=o.hash_value and o.sid = XXXXX;
 
现在应该可以定位到那个页面或MODULE导致这个的问题.

Websphere里有个参数Statement cache size ,也是用来缓存的。
看是否大与Oracle的设置。
  • In WebSphere Application Server V5, navigate to the data source in the Admin Console. The Statement cache size appears on the main data source configuration panel.
  • In WebSphere Application Server V6, navigate to the data source in the Admin Console. Under Additional Properties, select WebSphere Application Server data source properties. The first property listed on the resulting screen is the Statement cache size.
另一个也可以设置cursor_sharing = force, 不过这个要看具体环境了。

程序问题,比如:
Java代码在执行conn.createStatement()和conn.prepareStatement()的时候,实际上都是相当与在数据库中 打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这 个问题。因为游标一直在不停的打开,而且没有关闭。
 
还看到ITPUB上一例是存储空间的问题, 关键还是找到是哪些SQL OPEN 了CURSOR,然后对症下药。
 
### Navicat 中 ORA-01000 错误解决方案 ORA-01000Oracle 数据库中的常见错误之一,表示已超出打开游标的最大数目。此问题通常发生在应用程序未正确关闭先前的游标时,或者当系统设置的最大游标数不足以支持当前的工作负载时。 以下是针对该问题的具体分析和解决方法: #### 1. 增加 `OPEN_CURSORS` 参数 Oracle 的初始化参数 `OPEN_CURSORS` 控制了每个会话可以拥有的最大打开游标数。如果默认值过低,则可能导致 ORA-01000 错误。可以通过修改数据库实例的配置文件来调整这一参数[^2]。 ```sql ALTER SYSTEM SET OPEN_CURSORS=300 SCOPE=BOTH; ``` 上述命令将 `OPEN_CURSORS` 设置为 300,并将其保存到内存和磁盘中以便重启后仍然生效。需要注意的是,在更改之前应评估系统的实际需求并测试性能影响。 #### 2. 修改应用逻辑以及时释放资源 许多情况下,ORA-01000 并非由数据库本身引起,而是由于客户端程序未能妥善管理其使用的游标所致。对于通过 Navicat 进行操作的情况,可能的原因包括查询执行完毕后未显式关闭结果集或连接池泄漏等问题[^3]。 为了防止此类情况发生,开发人员应当遵循以下最佳实践: - **确保每次完成数据检索之后都调用了相应的关闭函数**; - 如果正在运行循环语句批量处理记录,请考虑采用绑定变量的方式减少重复创建新对象的可能性; - 定期监控活动会话的状态以及它们所占用的各种资源指标(如临时表空间使用量、锁等待时间等),从而尽早发现问题所在。 #### 3. 使用 PL/SQL 批量处理代替多次单独 SQL 请求 频繁提交小型事务可能会显著增加服务器端开销并消耗更多可用游标配额。因此推荐改写业务流程使其能够一次性传递全部所需输入参数给存储过程内部实现复杂计算功能后再返回最终成果给前端界面展示出来即可满足大部分场景下的效率追求目标同时降低对外部接口依赖程度进而缓解因并发访问过高而导致的压力状况[^4]。 示例代码如下所示: ```plsql CREATE OR REPLACE PROCEDURE bulk_process(p_ids IN SYS.ODCINUMBERLIST) AS BEGIN FORALL i IN INDICES OF p_ids INSERT INTO target_table (id, value) VALUES (p_ids(i), some_function(p_ids(i))); END; / ``` 以上脚本定义了一个接受数组作为参数的自定义子程序,允许用户传入多个 ID 同步更新对应的目标字段而无需反复建立断连动作节省大量网络传输成本同时也减少了中间件层面上额外维护状态信息所带来的负担效果非常明显值得借鉴推广开来用于优化现有架构设计思路当中去探索更加高效合理的解决方案方向上来讲是非常有意义的一次尝试经历分享给大家共同学习进步成长起来吧! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值