【问题标题】:ORA-01000 maximum open cursors exceeded with Spring data accessORA-01000 超过 Spring 数据访问的最大打开游标
【发布时间】:2015-08-09 23:33:34
【问题描述】:

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

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

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

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

请给我一些提示,告诉我我可以检查什么。

【问题讨论】:

标签: spring oracle oracle11g spring-data


【解决方案1】:

您可以调试是否以及在何处泄漏 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 ,可以对结果进行后处理,去除尾随字符,并对查询进行分组和统计。

我写了一篇关于Debugging Oracle PreparedStatement Leaks的文章。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多