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

如果我有以下方法 –

public static void C() { Connection con = DriverManager.getConnection(); .... // code return; } 

并且我不调用con.close() ,一旦方法返回,连接会自动终止吗?

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

不,它不会。 它可能会或可能不会最终关闭,但它会在很长一段时间之前完成,如果有的话。 连接类的终结器可能会在连接打开时关闭连接,但是很多情况下终结器都没有运行。 必须明确地调用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子句中检测到未关闭的连接后,我将其关闭,但不允许任何exception,这样做可能会导致抛出。 这是因为主逻辑正确地关闭了连接,这意味着如果我在finally块中找到了一个打开的连接,则已经抛出exception并且我们正在处理它,所以我不想通过从con.close()抛出一个不同的exception。

有了不错的助手,它会变得更短更容易编写:

 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; } 

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

如果丢失对Connection对象的所有引用,请不要编写依赖于自动关闭Connection 。 始终从finally块关闭连接(以便即使出现exception也会发生):

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

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

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

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