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



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

最好的解决方案是找到连接打开而不是关闭的位置(可能findbug可以在这方面提供帮助)。

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

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

请给我一些提示,我可以检查哪些

你可以调试你是否泄漏了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,在那里可以对结果进行后处理,可以删除尾随字符,查询可以分组和计数。

我写了一篇关于调试Oracle PreparedStatement泄漏的文章。

也许这个描述有点过时了。最后,在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。当您知道哪些SQL泄露了db资源时,您可以在源代码中找到问题所在的位置。

相关内容

最新更新