JDBC:如果我失去对Connection对象的引用,连接是否会中断?

时间:2010-06-06 09:15:44

标签: java sql jdbc

如果我有以下方法 -

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

    .... // code

    return;
}

我不打电话给con.close(),一旦方法返回,连接会自动终止吗?

3 个答案:

答案 0 :(得分:3)

  

...一旦方法返回,连接会自动终止吗?

不,它不会。它可能会或可能不会最终关闭,但它会持续很长时间,如果有的话。连接类的终结器可能会在连接打开时关闭连接,但是很多情况下终结器都没有运行。 必要明确调用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 :(得分:1)

方法返回时不会立即关闭。最终,Connection对象将被垃圾收集,然后终结器可能会关闭连接。但是不能保证什么时候会发生这种情况。

如果丢失对Connection对象的所有引用,请不要编写依赖于自动关闭连接的程序。始终关闭finally块的连接(即使发生异常也会发生这种情况):

Connection conn = DriverManager.getConnection(...);
try {
    // ... code that uses the connection
}
finally {
    // Close the connection
    conn.close();
}

答案 2 :(得分:0)

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

  

注意:在垃圾回收时,Connection对象会自动关闭。某些致命错误也会关闭Connection对象。

那就是说,你应该明确地关闭你的连接。