关闭ResultSet但不关闭PreparedStatement

Ham*_*riZ 3 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
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

是Oracle 11g,jdbc 11.2.0.3

谢谢

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

Jea*_*ard 6

如果 ResultSet 关闭,但PreparedStatement 不关闭,我会发生什么类型的资源泄漏?

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

ORA-01000: maximum open cursors exceeded
Run Code Online (Sandbox Code Playgroud)

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


从 java 7 开始,处理此问题的最佳方法是使用带有 ressources 的 try。和ResultSetPreparedStatement实现了AutoCloseable接口,这意味着它们将在不再需要时关闭。

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

请注意,相反的操作不会导致任何问题,因为关闭语句将自动关闭其结果集。


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

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;
Run Code Online (Sandbox Code Playgroud)

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