使用Utility类查询Connection泄漏

时间:2013-12-24 06:21:50

标签: java connection-leaks

我有一个JDBC实用程序类,它将Resultset,Statement和Connection实例保存为全局引用。此类具有基本的两个方法,如'execute'(有一些参数)和'close',并且在execute中,创建了上面的实例,已分配并最终返回创建的Resultset。

'close'方法关闭Resultset,Statement和Connections的所有打开的连接,就像这样。

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 个答案:

答案 0 :(得分:0)

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

在已关闭的ResultSet对象上调用close方法是无操作。 请查看Java文档resultset

答案 1 :(得分:0)

在已关闭的ResultSet对象上调用close()无效并且不会出错。

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

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