Затмение возможные утечки соединения

Я активировал в 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 не закрыт. Однако я написал, чтобы закрыть ResultSet, PreparedStatement и объекты Connection в моем пункте finally. Это правильно написано или есть лучшие и более чистые способы кодирования этого?

Вот скриншот предупреждений:

4 ответа

Решение

Это выглядит хорошо. IDE может знать только так много. finally будет вызван. Однако вы можете подумать о том, что влияет на другие предупреждения? Поскольку они заслонены окном предупреждения, я не могу сказать.

То, что вы делаете, это нормально. Затмение только показывает потенциальное предупреждение, но в этом случае все в порядке.

Блок finally всегда будет вызываться (если только JVM не взорвется или вы не сделаете что-то вроде System.Exit()).

Интересно, что в зависимости от того, как написано close(), вы можете не закрывать PrepStmt или Connectie, потому что если "result" равно null, вызов close для него вызовет исключение NullPointerException, а затем последующее закрытие не произойдет.

Я ценю, что вышеизложенное не является прямым ответом на ваш вопрос.

Что может иметь значение, так это то, что если IDE ищет "result.close()", тогда close (result) может не вызвать предупреждение. Не будучи большим пользователем затмения, я не могу сказать.

Передовой опыт продолжился, так как на этот вопрос был дан ответ.

В случае, если кто-то еще приземлится здесь, имейте в виду, что рекомендуемый подход теперь состоит в том, чтобы использовать попытку с ресурсами для каждого из "ресурсов" Connection, PreparedStatement и ResultSet. Этот подход использует преимущества интерфейса AutoCloseable и позволяет устранить этот тип блока finally.

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

Другие вопросы по тегам