关于open cursor 的释放问题
Oracle 10.2.0.4 , Linux AS 5.3 , RAC , 4 nodes
open_cursors 原来设置为 1000 , 3 个节点, 2个用于OLTP 事务, 1 个用于报表查询 ,没有发生过 ora-01000 的错误
上周加入了一个节点, 变成 4 节点, 除了应该修改的 cluster 方面的参数有修改外, 其他保持不变, 然后OLTP 段的节点变成
3 个节点, 报表查询还是用原来那个节点, 本周系统transaction 是原来的 1.5 倍 (生产扫描系统, 产线运作速度比原来快很多) 。
结果发现有些程序会报如下的错误 , 报错的这个程序大多是生产线运作非常快的段, 大概 5%左右的客户端会报, 重新启动程序后
ok , 后来我们更改了 open_cursors = 1500, 但是还是会发生, 明显是程序段的问题了, 结果发现程序中call 某些存储过程,
存储过程中有很多定义的cursors , 写法大概如下, 数据集cursor 的关闭都是在调用它们的程序中 free 的 (delphi程序) , 发现了
有一段恰好是上周上线的一个程序调用某些procedure 没有 free , 修改成程序后明显好一些 .
但是如果系统扫描条码速度非常快,密集的话, open cursors 还是会不断增加 ,速度降下来之后,监控发现current open cursors
会降一些 , 不过按照道理, 如果程序中都有free 掉cursor 的话, 应该用完了就释放才对啊 , 为什么要闲置很久cursors 才会降
下来呢 ?? 如果一个操作非常频繁的系统, 那它打开cursor 的速度永远比close cursor 来的快, 很快即使设置 5000 个open_cursors 估计都不够用 (假设程序中有close) .

ora-01000-2.jpg
open_cursors 原来设置为 1000 , 3 个节点, 2个用于OLTP 事务, 1 个用于报表查询 ,没有发生过 ora-01000 的错误
上周加入了一个节点, 变成 4 节点, 除了应该修改的 cluster 方面的参数有修改外, 其他保持不变, 然后OLTP 段的节点变成
3 个节点, 报表查询还是用原来那个节点, 本周系统transaction 是原来的 1.5 倍 (生产扫描系统, 产线运作速度比原来快很多) 。
结果发现有些程序会报如下的错误 , 报错的这个程序大多是生产线运作非常快的段, 大概 5%左右的客户端会报, 重新启动程序后
ok , 后来我们更改了 open_cursors = 1500, 但是还是会发生, 明显是程序段的问题了, 结果发现程序中call 某些存储过程,
存储过程中有很多定义的cursors , 写法大概如下, 数据集cursor 的关闭都是在调用它们的程序中 free 的 (delphi程序) , 发现了
有一段恰好是上周上线的一个程序调用某些procedure 没有 free , 修改成程序后明显好一些 .
但是如果系统扫描条码速度非常快,密集的话, open cursors 还是会不断增加 ,速度降下来之后,监控发现current open cursors
会降一些 , 不过按照道理, 如果程序中都有free 掉cursor 的话, 应该用完了就释放才对啊 , 为什么要闲置很久cursors 才会降
下来呢 ?? 如果一个操作非常频繁的系统, 那它打开cursor 的速度永远比close cursor 来的快, 很快即使设置 5000 个open_cursors 估计都不够用 (假设程序中有close) .
ora-01000-2.jpg
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-659523/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-659523/