在Oracle 11g数据库上执行查询时,我的应用程序中的ora-01000最大打开游标超出了错误。我浏览了一些关于它的博客,发现: 如果应用程序打开的连接数多于Oracle的OPEN_CURSOR属性中指定的值,则会导致此错误。为ResultSet和PreparedStatements打开游标。
对此最好的解决方案是找到连接打开和未关闭的位置(可能findbug可以帮助解决此问题)。
我正在使用Spring数据访问和JdbcTemplate,它管理所有这些连接,结果集,语句等的打开和关闭。 还使用了连接池。
我的疑问是,如果Spring管理所有连接处理(打开和关闭),那么我在应用程序中如何找到打开的连接,因为我不是管理它的人。
请给我一些关于我可以检查的内容的一些提示。
答案 0 :(得分:2)
您可以调试泄漏PreparedStatements的时间和地点
T4CPreparedStatement
个实例的数量,如果有几百个您有泄漏SELECT DISTINC toString(oracle_sql.value) FROM oracle.jdbc.driver.OracleSql
我写了一篇关于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泄漏数据库资源时,您可以在源代码中找到问题所在的位置。