У меня есть следующий код, в котором я хочу закрыть объект 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 или пытаются с ресурсами, а затем создают объект и используют его, пытаются и наконец закрывают. Однако здесь объект создается в отдельной функции и возвращается оттуда, а затем используется. Итак, создание и использование происходят в двух разных местах. Поэтому я хочу знать оба способа справиться с этим
упс... я вижу jdbcTemplate. Я использую его правильно, нет необходимости освобождать ресурсы (я думаю, вы используете Spring, и JdbcTemplate позаботится об этом)
вот связанный с этим вопрос: stackoverflow.com/q/23961553/217324 Насколько я понимаю, это случай, когда оператор не закрывается, что также приводит к тому, что параметры не работают, и все это взрывается. так что на практике это не проблема. но сонар этого конечно не видит.
это какая-то старая кодовая база, с которой я работаю. Ссылка, которой вы поделились, я просмотрел ее, но не нашел. Поскольку createPreparedStatement мог быть вызван jdbc в какой-то момент его выполнения, поэтому я думаю, что он должен нести ответственность только за закрытие. Не представляется возможным закрыть в коде приложения, который у меня был, поскольку у меня нет доступа к объекту prepareStatement.? В ссылка, которой вы поделились в окончательном решении, они предполагают, что у нас есть подготовленный объектStatement, я думаю.
В этом случае вам не нужно закрывать оператор, так как JdbcTemplate
Spring сделает это за вас. Другими словами, это ложное срабатывание Sonar.
Как указано в javadoc PreparedStatementCreator.createPreparedStatement(Connection con) (выделено мной):
Создайте заявление в связи с этим. Позволяет реализациям использовать Подготовленные заявления. JdbcTemplate закроет созданный заявление.
да, я только что прочитал об этом. Но если бы jdbc этого не делал, что может быть лучшим способом справиться с этим? Или какой-нибудь лучший способ использовать PreparedStatementCreator?
@rahulshharma Невозможно угадать или дать совет для гипотетических ситуаций, которые не представлены в вопросе. Ситуация, представленная в вашем вопросе, однозначна: закрывать не нужно, так как Springs JdbcTemple
(не JDBC!), закрывает его за вас. Как правило, рекомендуется использовать попытку с ресурсом, но эта ситуация является исключением из этого совета.
хорошо. Большое спасибо. Так как я пробую это впервые, поэтому я очень хотел спросить. Получил разъяснения. благодаря тонну
Я считаю это плохим выбором дизайна, в любом случае вызывающая сторона несет ответственность за закрытие связанных ресурсов - как это может быть сделано вызывающим методом?