Spring数据访问超出ORA-01000最大打开游标数

时间:2015-05-27 18:04:01

标签: spring oracle oracle11g spring-data

在Oracle 11g数据库上执行查询时,我的应用程序中的ora-01000最大打开游标超出了错误。我浏览了一些关于它的博客,发现: 如果应用程序打开的连接数多于Oracle的OPEN_CURSOR属性中指定的值,则会导致此错误。为ResultSet和PreparedStatements打开游标。

对此最好的解决方案是找到连接打开和未关闭的位置(可能findbug可以帮助解决此问题)。

我正在使用Spring数据访问和JdbcTemplate,它管理所有这些连接,结果集,语句等的打开和关闭。 还使用了连接池。

我的疑问是,如果Spring管理所有连接处理(打开和关闭),那么我在应用程序中如何找到打开的连接,因为我不是管理它的人。

请给我一些关于我可以检查的内容的一些提示。

2 个答案:

答案 0 :(得分:2)

您可以调试泄漏PreparedStatements的时间和地点

  1. 进行堆转储(VisualVM,jcmd GC.heap_dump,jmap,...)
  2. 将堆转储加载到Eclipse MAT
  3. 查看T4CPreparedStatement个实例的数量,如果有几百个您有泄漏
  4. 如果您有泄漏,请运行以下OQL查询SELECT DISTINC toString(oracle_sql.value) FROM oracle.jdbc.driver.OracleSql
  5. 将结果导出为CSV并将其导入SQLite Manager ,结果可以进行后处理,可以删除尾随字符,并可以对查询进行分组和计数。
  6. 我写了一篇关于Debugging Oracle PreparedStatement Leaks的文章。

答案 1 :(得分:0)

也许这个解密有点过时了。最后,在Java7中,您可以使用try-with-resources构造来控制资源生命周期。 https://blogs.oracle.com/WebLogicServer/entry/using_try_with_resources_with。 您不仅在打开/关闭连接时遇到问题。您还应该关闭ResultSets

在Oracle中,您可以通过加入v $ sql,V $ session和v $ open_cursor轻松找到连接上执行的最后一个SQL,请参阅this answer. 当您知道哪个SQL泄漏数据库资源时,您可以在源代码中找到问题所在的位置。