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对象。
也就是说,你应该明确地关闭你的连接。