Код: Выделить всё
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.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);
}
}
Подробнее здесь: https://stackoverflow.com/questions/226 ... et-closing
Мобильная версия