如果我有以下方法 -
public static void C() {
Connection con = DriverManager.getConnection();
.... // code
return;
}
我不打电话给con.close()
,一旦方法返回,连接会自动终止吗?
答案 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对象。
那就是说,你应该明确地关闭你的连接。