java - 关闭 ResultSet 但不关闭 PreparedStatement

标签 java oracle jdbc

如果 ResultSet 关闭但 PreparedStatement 不关闭,我预计会发生什么类型的资源泄漏。非常可疑,它会导致打开游标问题...

   PreparedStatement p = connection.prepareStatement(...);
    try {
      ResultSet r = p.executeQuery();
      try {
        while (r.next()) {
          ....
        }
      } finally {
        try {
          r.close();
        } catch (SQLException e) {
        // log this or something -- prevent these from masking original exception
        }
      }
    }

是Oracle 11g,jdbc 11.2.0.3

谢谢

请尝试回答我的问题,不要专注于修复

最佳答案

What type of resource leak can I expect if ResultSet is closed, but PreparedStatement not ?

泄漏将是最大的打开游标问题。

ORA-01000: maximum open cursors exceeded

如果超过最大打开游标数,数据库将变得不可用,除了已经持有的游标。但是,大多数情况下,发生这种情况时,甚至不会使用保持的游标(您的问题就是这种情况)。


从 Java 7 开始,处理这个问题的最佳方法是使用 try with ressources . ResultSetPreparedStatement 都实现了 AutoCloseable 接口(interface),这意味着它们将在不再需要时关闭。

如果您没有 Java 7,则需要在 finally block 中处理此问题,但请确保在关闭之前验证空值,否则如果资源从未存在,您可能会遇到 NPE初始化。

请注意,反向不会导致任何问题,因为关闭语句会自动关闭它的结果集。


请注意,您可以轻松地为您的应用程序允许更多游标,以减少超过最大值的可能性。

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

但是,大多数情况下,如果您遇到最大打开游标,这不应该是一个解决方案,因为它只会隐藏真正的问题。

关于java - 关闭 ResultSet 但不关闭 PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28968990/

相关文章:

java - 找到 [nvarchar2 (Types#OTHER)],但期待 [varchar2(255 char) (Types#VARCHAR)]

mysql - 使用 JDBC 和 Java EE 应用 MVC 设计模式连接到 MySQL

java - 构造函数必须在方法返回之前调用 super() 或 this()

oracle - 在 Oracle/ODP.NET 中查询 USER_OBJECTS 时遇到问题

sql - Oracle SQL : Group by not working with aggregates in CASE statement

java - 使用 JDBC Statement 或PreparedStatement 执行一组查询

java - 如何通过 JDBC 实现持久化相关(级联)对象

java - 解析 KML 文档时 publicId 和 systemId 之间需要空格

java - 理解 Gui 和 Listeners

java - 将 8 位灰度图像字节数组转换为 BufferedImage