Java - SonarLint Detect the Blocker - Закройте это «PreparedStatement» в предложении «finally» - PullRequest
0 голосов
/ 06 июля 2018

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

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

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);
        }
    }

1 Ответ

0 голосов
/ 06 июля 2018

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

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

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

...