Try/Try-with-resources и закрытие Connection, Statement и ResultSetJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Try/Try-with-resources и закрытие Connection, Statement и ResultSet

Сообщение Anonymous »

Недавно я обсуждал с моим профессором, как работать с базовой схемой соединения jdbc. Предположим, мы хотим выполнить два запроса, вот что он предлагает

Код: Выделить всё

public void doQueries() throws MyException{
Connection con = null;
try {
con = DriverManager.getConnection(dataSource);
PreparedStatement s1 = con.prepareStatement(updateSqlQuery);
PreparedStatement s2 = con.prepareStatement(selectSqlQuery);

// Set the parameters of the PreparedStatements and maybe do other things

s1.executeUpdate();
ResultSet rs = s2.executeQuery();

rs.close();
s2.close();
s1.close();
} catch (SQLException e) {
throw new MyException(e);
} finally {
try {
if (con != null) {
con.close();
}
} catch (SQLException e2) {
// Can't really do anything
}
}
}
Мне не нравится этот подход, и у меня есть два вопроса по этому поводу:

1.A) Я думаю, что если какое-либо исключение будет выдано там, где мы делаем «другие вещи», или в строке rs.close() или s2.close(), то s1 не будет закрыт, когда метод завершится. Прав ли я в этом?

1.B) Профессор продолжает просить меня явно закрыть ResultSet (даже когда в документации Statement ясно указано, что он закроет ResultSet). Она говорит, что Sun рекомендует это. Есть ли причина это делать?

Теперь я считаю, что это правильный код для того же самого:

Код: Выделить всё

public void doQueries() throws MyException{
Connection con = null;
PreparedStatement s1 = null;
PreparedStatement s2 = null;
try {
con = DriverManager.getConnection(dataSource);
s1 = con.prepareStatement(updateSqlQuery);
s2 = con.prepareStatement(selectSqlQuery);

// Set the parameters of the PreparedStatements and maybe do other things

s1.executeUpdate();
ResultSet rs = s2.executeQuery();

} catch (SQLException e) {
throw new MyException(e);
} finally {
try {
if (s2 != null) {
s2.close();
}
} catch (SQLException e3) {
// Can't do nothing
}
try {
if (s1 != null) {
s1.close();
}
} catch (SQLException e3) {
// Can't do nothing
}
try {
if (con != null) {
con.close();
}
} catch (SQLException e2) {
// Can't do nothing
}
}
}
2.А) Верен ли этот код? (Гарантировано ли, что все закроется по завершении метода?)

2.B) Это очень большой и многословный код (и становится хуже, если операторов больше) Есть ли более короткий или более элегантный способ сделать это без использования try-with-resources?

Наконец, это код, который мне нравится больше всего

Код: Выделить всё

public void doQueries() throws MyException{
try (Connection con = DriverManager.getConnection(dataSource);
PreparedStatement s1 = con.prepareStatement(updateSqlQuery);
PreparedStatement s2 = con.prepareStatement(selectSqlQuery))
{

// Set the parameters of the PreparedStatements and maybe do other things

s1.executeUpdate();
ResultSet rs = s2.executeQuery();

} catch (SQLException e) {
throw new MyException(e);
}
}
3) Верен ли этот код? Я думаю, что моему профессору этот способ не нравится, потому что нет явного закрытия ResultSet, но она сказала мне, что ее это устраивает, если в документации ясно, что все закрыто. Можете ли вы дать ссылку на официальную документацию с аналогичным примером или на основе документации показать, что с этим кодом проблем нет?

Подробнее здесь: https://stackoverflow.com/questions/226 ... et-closing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»