3

我在 Eclipse 中活动它显示可能的数据库连接泄漏。

我有这段代码:

public static Administrator getAdministrator(String gebruikersnaam, String wachtwoord)     throws CustomException {
    Connection connectie = null;
    PreparedStatement prepStmt = null;
    ResultSet result = null;
    try {
        connectie = ConnectionPool.getInstance().getConnection(true, true);
        prepStmt = connectie.prepareStatement(QUERY_GET_ADMINISTRATOR);
        prepStmt.setString(1, gebruikersnaam);
        prepStmt.setString(2, wachtwoord);
        result = prepStmt.executeQuery();

        if (result.next()) {
            Administrator admin = new Administrator(result.getString(1), result.getString(2), result.getString(3));

            return admin;
        } else {
            return null;
        }
    } catch (SQLException e) {
        throw new CustomException("Fout opgetreden bij het opvragen van een administrator uit de databank (" + e.getMessage() + ").");
    } finally {
        close(result);
        close(prepStmt);
        close(connectie);
    }
}

Eclipse 在返回的行和我抛出 CustomException 的行警告说 ResultSet 结果未关闭可能存在资源泄漏。但是,我已经在 finally 子句中关闭了 ResultSet、PreparedStatement 和 Connection 对象。这是正确编写的还是有更好、更简洁的编码方式?

这是警告的屏幕截图:

在此处输入图像描述

4

4 回答 4

3

你在做什么是好的。Eclipse 只是显示一个潜在的警告,但在这种情况下它是可以的。

finally 块将始终最终被调用(除非 JVM 爆炸或您执行类似的操作System.Exit())。

于 2013-11-12T01:44:54.253 回答
3

这看起来不错。IDE 只能知道这么多。将finally被调用。但是,您可能需要考虑其他警告的影响是什么?由于它们被警告框遮挡,我无法分辨。

于 2013-11-12T01:47:36.233 回答
2

有点有趣的是,根据 'close()' 的编写方式,您最终可能不会关闭 prepStmt 或 connectie,因为如果 'result' 为 null,则对其调用 close 将引发 NullPointerException,然后不会发生后续关闭。

我很欣赏以上不是您问题的直接答案。

可能相关的是,如果 IDE 正在寻找“result.close()”,那么 close(result) 可能不会触发警告。不是一个大的日食用户,我不能说。

于 2013-11-12T02:11:55.017 回答
0

自从回答了这个问题以来,最佳实践继续前进。

万一其他人登陆这里,请记住,现在推荐的方法是为每个 Connection、PreparedStatement 和 ResultSet 'resources' 使用 try-with-resources。这种方法利用了 AutoCloseable 接口并允许消除这种类型的 finally 块。

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

于 2017-12-12T16:55:51.927 回答