Хорошо, я понял, что действительно задал слишком много вопросов, не внося свой вклад в сообщество, но я хочу узнать ваше мнение по этому поводу. Скажи, если у меня есть
private void closeAll(ResultSet rs, PreparedStatement ps, Connection con) {
if (rs != null)
try {
rs.close();
} catch (SQLException e) {
}
if (ps != null)
try {
ps.close();
} catch (SQLException e) {
}
if (con != null)
try {
con.close();
} catch (SQLException e) {
}
}
и я хотел сделать несколько операций с моей базой данных MySQL, используя одно соединение. Лучше написать
Connection con = ...;
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = con.prepareStatement(...);
rs = ps.executeQuery();
if (rs.next()) ...;
} catch (SQLException e) {
System.err.println("Error: " + e);
} finally {
closeAll(rs, ps, null);
}
try {
ps = con.prepareStatement(...);
rs = ps.executeQuery();
if (rs.next()) ...;
} catch (SQLException e) {
System.err.println("Error: " + e);
} finally {
closeAll(rs, ps, con);
}
или
Connection con = ...;
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = con.prepareStatement(...);
rs = ps.executeQuery();
if (rs.next()) ...;
rs.close();
ps.close();
ps = con.prepareStatement(...);
rs = ps.executeQuery();
if (rs.next()) ...;
} catch (SQLException e) {
System.err.println("Error: " + e);
} finally {
closeAll(rs, ps, con);
}
Я считаю, что лучше иметь в виду либо более безопасный, более четкий, более краткий или более надежный. Я не уверен, будет ли последний всегда закрывать те подготовленные операторы и наборы результатов, которые открыты всякий раз, когда он встречает исключение, хотя я полагаю, что это выглядит более кратким. Но первый выглядит лучше, так как он более последовательный, но при этом увеличивает накладные расходы, поскольку использует больше блоков try finally.
Я понимаю, что часть автоматического управления ресурсами Java 7 Project Coin заставит меня склоняться к первому, поскольку ресурсы, используемые в заголовке, неявно являются окончательными в теле. Тем не менее, у меня есть достаточно времени, прежде чем мне придется беспокоиться о пересмотре своего кода, чтобы адаптировать его к ARM и иметь возможность удалить шаблонный код, поэтому остается вопрос: из двух вышеописанных стилей, что было бы лучше? Если они оба будут выполнять ожидаемое поведение, то даст ли последний заметный прирост производительности, извиняющий стиль «уродливее»?