JDBC: разрывается ли соединение, если я теряю ссылку на объект соединения? - PullRequest
3 голосов
/ 06 июня 2010

Если у меня есть следующий метод -

public static void C()  {
    Connection con = DriverManager.getConnection();

    .... // code

    return;
}

и я не вызываю con.close(), будет ли соединение разорвано автоматически после возврата метода?

Ответы [ 3 ]

3 голосов
/ 06 июня 2010

... будет ли соединение разорвано автоматически после возврата метода?

Нет, не будет. Это может или не может в конечном счете закрыться, но пройдет много времени, прежде чем это произойдет, если вообще когда-нибудь. Финализатор класса соединения, вероятно, закрывает соединение, если оно открыто, но во многих ситуациях финализаторы никогда не запускаются. необходимо явно назвать 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;
}
1 голос
/ 06 июня 2010

Он не закроется сразу, когда метод вернется.В конечном итоге объект Connection будет собирать мусор, и, вероятно, финализатор закроет соединение.Но нет никакой гарантии, когда это произойдет.

Не пишите программы, которые полагаются на автоматическое закрытие соединения, если вы потеряете все ссылки на объект Connection.Всегда закрывайте соединение из блока finally (чтобы это произошло даже в случае исключения):

Connection conn = DriverManager.getConnection(...);
try {
    // ... code that uses the connection
}
finally {
    // Close the connection
    conn.close();
}
0 голосов
/ 06 июня 2010

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Connection.html#close%28%29

Примечание. Объект подключения автоматически закрывается при сборке мусора. Некоторые фатальные ошибки также закрывают объект Connection.

Тем не менее, вы, вероятно, должны закрыть свои соединения явно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...