0

我有一个 JDBC 实用程序类,它保存结果集、语句和连接实例作为全局引用。这个类有基本的两种方法,如“执行”(有一些参数)和“关闭”和内部执行,上面的实例被创建和分配,最后返回创建的结果集。

'close' 方法就像这样关闭结果集、语句和连接的所有打开的连接。

public void close() {

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException sqlEx) {
                sqlEx.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException sqlEx) {
                sqlEx.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException sqlEx) {
                    sqlEx.printStackTrace();
            }
        }
    }

我的客户端应用程序创建了一个实用程序实例并获得如下结果集。

ResultSet rs = dbutil.execute(strQuery,values);

如果我在我的客户端应用程序中使用rs.close并再次使用关闭结果集,dbutil.close()

  1. 它会发生一些连接泄漏或内存泄漏吗?
  2. 如果我只rs.close()在我的客户中使用会发生什么?
  3. 那里有可能造成连接泄漏吗?

提前致谢

4

2 回答 2

0

当 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,生成它的 Statement 对象会自动关闭 ResultSet 对象。

在已经关闭的 ResultSet 对象上调用方法 close 是无操作的。 请检查 Java 文档以获取结果集

于 2013-12-24T06:30:57.153 回答
0

调用close()已关闭的 ResultSet 对象没有任何效果,也不会出错。

如果您只使用rs.close(),您将泄漏语句和连接,这取决于您的应用程序的寿命以及您是否创建 dbutil 类的新实例可能会导致数据库错误(对于您的应用程序或其他使用相同数据库的应用程序)由于达到打开游标的最大数量(由于未关闭的语句)或最大连接数(由于未关闭的连接)。

如果您使用的是 Java 7,您还应该考虑让您的 dbutil 类实现该java.lang.AutoCloseable接口。如果您已将 dbutil 实例声明为局部变量,则这使您能够使用“try-with-resources”模式。不过,打开与数据库的连接相对较慢,因此除非您使用连接池,否则应避免在应用程序中多次关闭和重新打开它们。

于 2013-12-24T06:49:42.077 回答