Как закрыть PreparedStatement

У меня есть следующий код, в котором я хочу закрыть объект prepareStatement, поскольку он вызывается как ошибка сонара.

  public myfunction() throws SQLException {
            
           PreparedStatementCreator preparedStatementCreator = new PreparedStatementCreator() {
                String query = "";//let us assume a query
                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                    PreparedStatement preparedStatement= connection.prepareStatement(query);
                    preparedStatement.setString();
                    preparedStatement.setString();
                }
            };
    int rows;
    try
    {
    rowNumbers = jdbcTemplate.update(preparedStatementCreator);
    }
    catch(....)
    {
    }
    catch(....)
    {
    }
    catch(....)
    {
    }
    }

Как я могу закрыть подготовленный объектStatement? Большинство примеров, которые я видел, в основном используют try/finally или пытаются с ресурсами, а затем создают объект и используют его, пытаются и наконец закрывают. Однако здесь объект создается в отдельной функции и возвращается оттуда, а затем используется. Итак, создание и использование происходят в двух разных местах. Поэтому я хочу знать оба способа справиться с этим

  1. До Java 8
  2. С Java 8 попробуйте с ресурсами

Я считаю это плохим выбором дизайна, в любом случае вызывающая сторона несет ответственность за закрытие связанных ресурсов - как это может быть сделано вызывающим методом?

fantaghirocco 10.12.2020 14:58

упс... я вижу jdbcTemplate. Я использую его правильно, нет необходимости освобождать ресурсы (я думаю, вы используете Spring, и JdbcTemplate позаботится об этом)

fantaghirocco 10.12.2020 15:00

вот связанный с этим вопрос: stackoverflow.com/q/23961553/217324 Насколько я понимаю, это случай, когда оператор не закрывается, что также приводит к тому, что параметры не работают, и все это взрывается. так что на практике это не проблема. но сонар этого конечно не видит.

Nathan Hughes 10.12.2020 15:03

это какая-то старая кодовая база, с которой я работаю. Ссылка, которой вы поделились, я просмотрел ее, но не нашел. Поскольку createPreparedStatement мог быть вызван jdbc в какой-то момент его выполнения, поэтому я думаю, что он должен нести ответственность только за закрытие. Не представляется возможным закрыть в коде приложения, который у меня был, поскольку у меня нет доступа к объекту prepareStatement.? В ссылка, которой вы поделились в окончательном решении, они предполагают, что у нас есть подготовленный объектStatement, я думаю.

rahul sharma 10.12.2020 15:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
417
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом случае вам не нужно закрывать оператор, так как JdbcTemplate Spring сделает это за вас. Другими словами, это ложное срабатывание Sonar.

Как указано в javadoc PreparedStatementCreator.createPreparedStatement(Connection con) (выделено мной):

Создайте заявление в связи с этим. Позволяет реализациям использовать Подготовленные заявления. JdbcTemplate закроет созданный заявление.

да, я только что прочитал об этом. Но если бы jdbc этого не делал, что может быть лучшим способом справиться с этим? Или какой-нибудь лучший способ использовать PreparedStatementCreator?

rahul sharma 10.12.2020 15:26

@rahulshharma Невозможно угадать или дать совет для гипотетических ситуаций, которые не представлены в вопросе. Ситуация, представленная в вашем вопросе, однозначна: закрывать не нужно, так как Springs JdbcTemple (не JDBC!), закрывает его за вас. Как правило, рекомендуется использовать попытку с ресурсом, но эта ситуация является исключением из этого совета.

Mark Rotteveel 10.12.2020 16:47

хорошо. Большое спасибо. Так как я пробую это впервые, поэтому я очень хотел спросить. Получил разъяснения. благодаря тонну

rahul sharma 10.12.2020 18:24

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