先说一下我这边的情况。系统用Java连结Oracle,Java程序使用O/R框架,连结数据库的处理设计的很合理。但是,在正式的数据库环境中出现了(ORA-01000)最多允许打开的游标数错误,
想要找出发生错误的原因,在测试环境中再现类似的错误。
但是无论怎么弄,在测试环境中都无法实现。OPEN_CURSORS降到了3,用JMeter同时连接多个线程虚拟真实环境的流量也没用。
整个程序就像着了魔一样,在测试环境中就是实现不了(ORA-01000)最多允许打开的游标数错误。如题,请高人指点!

解决方案 »

  1.   

    出现这样的情况,还是好好检查JAVA代码。是否有游标打开出错未关闭。
    如果测试环境和生产库代码一样,检查测试库和生产库版本。
    一般来说,只要不是BUG,应该不会出现这样的异常。
      

  2.   


    Java中数据库的连接是用Spring+iBatis控制的。
    测试环境和正是环境的数据库是同一版本,只不过访问量不同而已。
      

  3.   


    不懂JAVA,Spring+iBatis,JMeter。
    弱弱问句:测试库和生产库OS平台一样吗?模拟并发可靠吗?
      

  4.   

    OPEN_CURSORS specifies the maximum number of open cursors (handles to private SQL areas) a session can have at once. You can use this parameter to prevent a session from opening an excessive number of cursors.It is important to set the value of OPEN_CURSORS high enough to prevent your application from running out of open cursors. The number will vary from one application to another. Assuming that a session does not open the number of cursors specified by OPEN_CURSORS, there is no added overhead to setting this value higher than actually needed.
    其实关于这个测试,主要看递归SQL,是否有游标。它是针对每session,和并发关系并不大。
    OPEN_CURSORS降到了3,用JMeter同时连接多个线程虚拟真实环境的流量也没用。
    因此比较怀疑,测试环境和正式环境的相似度。
      

  5.   

    感谢回答!测试平台和生产平台的OS都是一样的。请问,如何能够诱导数据库在session中增加递归SQL数量呢?
      

  6.   

    楼主,检查你的ibatis里面,是否存在类似于hib的级联加载的情况,有的话,相应修改成不使用级联,而是即用即取。
    就是说,比如你查一个表A,表A中某个字段(B_ID)关联到另一个表B(A->B,1-1~N),你在查表A的时候,递归调用了查B表对象的查询,(总共A有1个,B可能有N个)。这样可能会出打开游标数过多的问题。
    还有一个可能的原因,就是你某些地方的ResultSet没有关闭。参考下。还好你不是用hib,要不我要bs了,哈哈
      

  7.   


    1.我这边的开发,所有代码,除编写人员之外,都要经过2人以上确认,hib的这种结构基本不会存在。
    2.关闭ResultSet之类的操作都是在iBatis里面做的,写程序方并不需要直接操作。
    我目前最想知道的事,如何在不改动现有程序的前提下,让数据库发生(ORA-01000)最多允许打开的游标数错误,
    而不是避免发生。
      

  8.   

    1.先查一下系统当先的open_cursors
    SQL> show parameter open_cursorsNAME                    TYPE        VALUE
    ----------------------- ----------- ---------
    open_cursors            integer     3002.把open_cursors参数调小
    ALTER SYSTEM SET open_cursors = 100 SCOPE=SPFILE;
      

  9.   

    把open_cursors改为1,哈哈
    不明白你的问题,上面这句话是玩笑噢。别介意
      

  10.   

    我目前最想知道的事,如何在不改动现有程序的前提下,让数据库发生(ORA-01000)最多允许打开的游标数错误, 
    而不是避免发生。 我是感覺  這個應該測試不出來~~   基本不會在你的測試情況下重現。
    如果真的是因為 某些連接原因 導致異常  使cursor沒有正常關閉,那測試也沒辦法重現啊。
      

  11.   


    什么样的連接原因可以導致異常使cursor沒有正常關閉?