zoukankan      html  css  js  c++  java
  • open cursor too much error

    今天遇到一个错误ORA-01000: maximum open cursors exceeded。 客户想增加 DB 的open_cursor这个参数。 但是我看了下,她的程序要打开几千个cursor, 这样要把open_cursor设置成几千显然是不现实的。应该查一下为什么程序会打开几千个cursor。

    首先,我用如下语句看了下是哪一个session open cursor最多。

    select o.sid, osuser, machine, count(*) num_curs from v$open_cursor o, v$session s  where user_name = 'test' and o.sid=s.sid     group by o.sid, osuser, machine   order by   num_curs desc;

    在获取了session 之后用下面的SQL看了下该session中open_cursor都是些什么语句。 

    select O.SADDR , o.sid, osuser, machine, o.SQL_ID, o.SQL_TEXT from v$open_cursor o, v$session s  where user_name = 'MPCIAPP' and o.sid=s.sid  and o.sid=308;
    SID OSUSER       MACHINE              SQL_ID                                  SQL_TEXT
    ---------- ------------ -------------------- --------------------------------------- ------------------------------------------------
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1
            293 payprod      ct21upg              drk0vwks4j3za                           SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1

    可以看到有很多

    SELECT * FROM PS_CITIMESHEET WHERE STAFFN=:B1

    这个语句。这是个绑定变量的语句,按理说不应该有这么多cursor,因为绑定变量应该是可以共享cursor的。所以我觉得既然没共享应该有很多child cursor才对,我决定去看看child_cursor。

    select sql_id,sql_text,version_count from v$sqlarea where sql_text=

    可是这个语句居然没有没有产生很多 child_cursor。 这就奇怪了,没有产生很多child, 在v$open_cursor中确又有那么多cursor,这是怎么回事呢? 只有一种可能,就是 java 代码在调用这个sql语句之后没有释放资源。 而客户坚持称java 代码释放资源了。 并且这个程序在新加坡的环境执行是好使的。 

    后来通过替换 ojdbc 解决了这个问题。 原来是本地的ojdbc版本不对。 

    总结

    1. 注意ojdbc版本

    2. 注意思路

  • 相关阅读:
    第6章 静态路由和动态路由(2)_路由汇总和默认路由
    第6章 静态路由和动态路由(1)_静态路由
    第5章 IP地址和子网划分(4)_超网合并网段
    第5章 IP地址和子网划分(3)_子网划分
    第5章 IP地址和子网划分(2)_IP地址分类和NAT技术
    第5章 IP地址和子网划分(1)_IP格式和子网掩码
    第4章 数据链路层(5)_高速以太网
    第4章 数据链路层(4)_扩展以太网
    第4章 数据链路层(3)_广播信道的数据链路
    第4章 数据链路层(2)_点到点信道的数据链路
  • 原文地址:https://www.cnblogs.com/kramer/p/3492805.html
Copyright © 2011-2022 走看看