2010-04-25 49 views

回答

11

是否關閉一個java.sql.Connection 也關閉所有的語句, 準備語句等獲得從該連接 ?或者如果我關閉了 連接,但是將語句 等閒置了,會不會有內存泄漏 ?

您應該不是取決於它。

該規範內容如下:

應用程序調用的方法 將statement.close以表明它 處理完的聲明。 當創建它們的連接 關閉時,所有Statement對象將被關閉 。然而,編號爲 的做法對於申請在 完成處理之後立即關閉 報表的做法是不錯的。這允許 聲明正在使用的任何外部資源立即發佈 。

最好的做法是關閉所有結果集,語句和連接在finally塊,每個封閉在自己的try/catch,在收購的順序相反。

寫這樣的一類:

public class DatabaseUtils 
{ 
    public static void close(Statement s) 
    { 
     try 
     { 
      if (s != null) 
      { 
       s.close(); 
      } 
     } 
     catch (SQLException e) 
     { 
      // log or report in someway 
      e.printStackTrace(); 
     } 
    } 

    // similar for ResultSet and Connection 
} 

這樣調用:

Statement s; 
try 
{ 
    // JDBC stuff here 
} 
finally 
{ 
    DatabaseUtils.close(s); 
} 
+0

@duffymo:有沒有提供正式的文檔在哪裏可以找到更多這方面的信息? – Behrang 2010-04-25 15:21:58

+0

也許是JDBC規範,但是如果實施你的廠商決定不遵循這個建議,你就會遇到問題。那麼官方文件在這種情況下說什麼有什麼關係?只是好奇 - 爲什麼這個答案對你來說不夠權威? – duffymo 2010-04-25 15:24:24

+0

嗯,這是規範說的:13.1.4關閉語句對象---一個應用程序調用Statement.close方法來表示它已經完成了一個語句的處理。當創建它們的連接關閉時,所有Statement對象都將被關閉。不過,應用程序在完成處理後儘快關閉語句是一種良好的編碼實踐。這允許該語句正在使用的任何外部資源被立即釋放。 – Behrang 2010-04-25 15:32:04