我在Oracle 11g数据库上执行查询时,在我的应用程序中获得ora-01000最大打开游标超过错误。我浏览了一些关于它的博客,发现:如果应用程序打开的连接数超过Oracle的OPEN_CURSOR属性中指定的值,则会导致此错误。为ResultSet和PreparedStatements打开游标。
最好的解决方案是找到连接打开而不是关闭的位置(可能findbug可以在这方面提供帮助)。
我正在使用Spring数据访问和JdbcTemplate,它管理所有这些打开和关闭连接,结果集,语句等。还使用了连接池。
我的查询是,如果Spring正在管理所有的连接处理(打开和关闭),那么我怎么能在我的应用程序中找到打开的连接,因为我不是管理它的人。
请给我一些提示,我可以检查哪些
你可以调试你是否泄漏了PreparedStatements
- 生成堆转储(VisualVM, jcmd GC)。heap_dump, jmap,…)
- 将堆转储加载到Eclipse MAT
- 查看
T4CPreparedStatement
实例的数量,如果有数百个,则存在泄漏 - 如果有泄漏,运行以下OQL查询
SELECT DISTINC toString(oracle_sql.value) FROM oracle.jdbc.driver.OracleSql
- 将结果导出为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资源时,您可以在源代码中找到问题所在的位置。