先说一下我这边的情况。系统用Java连结Oracle,Java程序使用O/R框架,连结数据库的处理设计的很合理。但是,在正式的数据库环境中出现了(ORA-01000)最多允许打开的游标数错误,
想要找出发生错误的原因,在测试环境中再现类似的错误。
但是无论怎么弄,在测试环境中都无法实现。OPEN_CURSORS降到了3,用JMeter同时连接多个线程虚拟真实环境的流量也没用。
整个程序就像着了魔一样,在测试环境中就是实现不了(ORA-01000)最多允许打开的游标数错误。如题,请高人指点!
想要找出发生错误的原因,在测试环境中再现类似的错误。
但是无论怎么弄,在测试环境中都无法实现。OPEN_CURSORS降到了3,用JMeter同时连接多个线程虚拟真实环境的流量也没用。
整个程序就像着了魔一样,在测试环境中就是实现不了(ORA-01000)最多允许打开的游标数错误。如题,请高人指点!
如果测试环境和生产库代码一样,检查测试库和生产库版本。
一般来说,只要不是BUG,应该不会出现这样的异常。
Java中数据库的连接是用Spring+iBatis控制的。
测试环境和正是环境的数据库是同一版本,只不过访问量不同而已。
不懂JAVA,Spring+iBatis,JMeter。
弱弱问句:测试库和生产库OS平台一样吗?模拟并发可靠吗?
其实关于这个测试,主要看递归SQL,是否有游标。它是针对每session,和并发关系并不大。
OPEN_CURSORS降到了3,用JMeter同时连接多个线程虚拟真实环境的流量也没用。
因此比较怀疑,测试环境和正式环境的相似度。
就是说,比如你查一个表A,表A中某个字段(B_ID)关联到另一个表B(A->B,1-1~N),你在查表A的时候,递归调用了查B表对象的查询,(总共A有1个,B可能有N个)。这样可能会出打开游标数过多的问题。
还有一个可能的原因,就是你某些地方的ResultSet没有关闭。参考下。还好你不是用hib,要不我要bs了,哈哈
1.我这边的开发,所有代码,除编写人员之外,都要经过2人以上确认,hib的这种结构基本不会存在。
2.关闭ResultSet之类的操作都是在iBatis里面做的,写程序方并不需要直接操作。
我目前最想知道的事,如何在不改动现有程序的前提下,让数据库发生(ORA-01000)最多允许打开的游标数错误,
而不是避免发生。
SQL> show parameter open_cursorsNAME TYPE VALUE
----------------------- ----------- ---------
open_cursors integer 3002.把open_cursors参数调小
ALTER SYSTEM SET open_cursors = 100 SCOPE=SPFILE;
不明白你的问题,上面这句话是玩笑噢。别介意
而不是避免发生。 我是感覺 這個應該測試不出來~~ 基本不會在你的測試情況下重現。
如果真的是因為 某些連接原因 導致異常 使cursor沒有正常關閉,那測試也沒辦法重現啊。
什么样的連接原因可以導致異常使cursor沒有正常關閉?