今天遇到一个错误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. 注意思路

最新文章

  1. Bitmap转换成BitmapImage
  2. MySQL命令行导出数据库
  3. 解决 webx.ml 中The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 问题
  4. 【Shell脚本学习21】Shell break和continue命令
  5. position:fixed 居中问题
  6. linux系统定时重启tomcat
  7. java大数常用的方法
  8. 使用 TUN 设备实现一个简单的 UDP 代理隧道
  9. SkylineGlobe TerraExplorer for Web 7.1.0版本 接口示例
  10. 计算机基础 & python基础
  11. Xcode注释快捷键和Alfred 快捷键冲突解决方案
  12. C++ 自定义订单号
  13. ABP框架记录
  14. python3.6.5 + selenium +VS Code 运行报错:Unable to find a matching set of capabilities的解决
  15. Xlight FTP搭建FTP服务器教程
  16. php函数addslashes()使用方法详解
  17. Netty 聊天小程序
  18. lm393
  19. CPU GPU FPU TPU 及厂商
  20. mongodb查询速度慢是什么原因?

热门文章

  1. 我的github教程
  2. JavaScript 封装插件学习笔记(一)
  3. 前端开发之旅- 移动端HTML5实现文件上传
  4. Hive扩展功能(一)--Parquet
  5. JS——选择水果
  6. 离线安装Selenium
  7. 脚本添加删除nginx配置中的内容
  8. jsTree使用记录
  9. 20190625 Oracle优化查询(一)
  10. zoj 3314 CAPTCHA(纯模拟)