Java — SonarLint Detect the Blocker — закройте этот PreparedStatement в предложении finally

Заголовок: Java — SonarLint Detect the Blocker — закройте этот «PreparedStatement» в предложении «finally».

Вопрос: У меня есть несколько PreparedStatement в одном методе (пример), затем я закрыл PreparedStatement, но первая строка (// prepareStatement № 1 - table_a) PreparedStatement по-прежнему обнаруживает Блокировщик - ( Закройте этот "PreparedStatement" в пункт "наконец") :

PreparedStatement preparedStatement = null;
    try {
connection.setAutoCommit(false);
        // prepareStatement no 1
        preparedStatement = connection.prepareStatement("delete from table_a where abc_id=?");  
        preparedStatement.setString(1, abc_id);
        preparedStatement.executeUpdate();

        // prepareStatement no 2
        preparedStatement = connection.prepareStatement("delete from table_b where bc_id=?");       
        preparedStatement.setString(1, bc_id);
        preparedStatement.executeUpdate();

        // prepareStatement no 3
        preparedStatement = connection.prepareStatement("delete from table_c where cd_id=?");       
        preparedStatement.setString(1, cd_id);
        preparedStatement.executeUpdate();

        // prepareStatement no 4
        preparedStatement = connection.prepareStatement("delete from table_d where de_id=?");
        preparedStatement.setString(1, de_id);
        preparedStatement.executeUpdate();

        // prepareStatement no 5
        preparedStatement = connection.prepareStatement("delete from table_e where ef_id=?");           
        preparedStatement.setString(1, ef_id);
        preparedStatement.executeUpdate();      

        // prepareStatement no 6
        preparedStatement = connection.prepareStatement("delete from table_f where fg_id=?");
        preparedStatement.setString(1, fg_id);
        preparedStatement.executeUpdate();

        connection.commit();

 } catch(SQLException e) {
        log.error(e);
    } finally {
        try {
            if (preparedStatement != null) {
                preparedStatement.close();
            }

            connection.setAutoCommit(true);
        } catch (SQLException e) {
            log.error(e);
        }
    }

person fndong    schedule 06.07.2018    source источник
comment
Мне кажется, что это ложное срабатывание, потому что я не вижу причин, по которым SONAR блокирует это. Я совершенно уверен, что если вы удалите нулевую проверку, проблема исчезнет, ​​​​но это не имеет никакого смысла, поскольку необходимо выполнить нулевую проверку.   -  person codeLover    schedule 06.07.2018


Ответы (1)


Вы не закрываете подготовленные операторы. Вы закрываете только последний (или первый, на котором происходит исключение). Все остальные остаются незакрытыми. То, что вы присваиваете их одной и той же локальной переменной (preparedStatement), не означает, что Connection.prepareStatement повторно использует предыдущий оператор. На самом деле, я бы сомневался, что это так, ведь он не может знать, как работает ваш код.

Для подтверждения просмотрите свой код в отладчике. Следите за количеством подготовленных операторов и их внутренностями.

Лучше всего использовать попробовать ресурсы для автоматического закрыть каждое утверждение, когда оно выходит за рамки.

person Robert    schedule 06.07.2018