... будет ли соединение разорвано автоматически после возврата метода?
Нет, не будет. Это может или не может в конечном счете закрыться, но пройдет много времени, прежде чем это произойдет, если вообще когда-нибудь. Финализатор класса соединения, вероятно, закрывает соединение, если оно открыто, но во многих ситуациях финализаторы никогда не запускаются. необходимо явно назвать con.close()
.
Вот как я обычно обращаюсь с этим (хотя я разбил большую часть этой логики на помощников, так как это многословно в противном случае):
public static void C()
throws SQLException
{
Connection con = DriverManager.getConnection();
try {
.... // code
// done with the connection
con.close();
con = null;
}
finally {
if (con != null) {
try {
con.close();
}
catch (Exception e) {
// Eat it to avoid masking any exception that
// got us here
}
}
}
}
Обратите внимание, что обнаружив незамкнутое соединение в предложении finally
, я закрываю его, но не допускаю, чтобы любое исключение, вызванное этим, могло привести к выбросу. Это связано с тем, что основная логика корректно закрывает соединение, а это означает, что если я обнаружил открытое соединение в блоке finally
, исключение уже было сгенерировано, и мы обрабатываем его, поэтому я не хочу маскировать что, выбрасывая отличное исключение из con.close()
.
С приличными помощниками это становится намного короче и легче писать:
public static void C()
throws SQLException
{
Connection con = DriverManager.getConnection();
try {
.... // code
// done with the connection
con = JDBCHelper.close(con); // <== This one *allows* any exception that occurs
}
finally {
con = JDBCHelper.quietClose(con); // <== This one *eats* any exception that occurs
}
}
... где JDBCHelper (гипотетический класс) содержит:
public static final Connection close(Connection con)
throws SQLException
{
con.close();
return null;
}
public static final Connection quietClose(Connection con)
{
if (con != null) {
try {
con.close();
}
catch (Exception e) {
}
}
return null;
}