6
關閉java.sql.Connection
是否也會關閉從該連接獲取的所有語句,預處理語句等?或者如果我關閉了連接但是將語句等關閉了,會不會有內存泄漏?java.sql.Connection.close()對java.sql.Statement對象等的影響
關閉java.sql.Connection
是否也會關閉從該連接獲取的所有語句,預處理語句等?或者如果我關閉了連接但是將語句等關閉了,會不會有內存泄漏?java.sql.Connection.close()對java.sql.Statement對象等的影響
是否關閉一個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);
}
@duffymo:有沒有提供正式的文檔在哪裏可以找到更多這方面的信息? – Behrang 2010-04-25 15:21:58
也許是JDBC規範,但是如果實施你的廠商決定不遵循這個建議,你就會遇到問題。那麼官方文件在這種情況下說什麼有什麼關係?只是好奇 - 爲什麼這個答案對你來說不夠權威? – duffymo 2010-04-25 15:24:24
嗯,這是規範說的:13.1.4關閉語句對象---一個應用程序調用Statement.close方法來表示它已經完成了一個語句的處理。當創建它們的連接關閉時,所有Statement對象都將被關閉。不過,應用程序在完成處理後儘快關閉語句是一種良好的編碼實踐。這允許該語句正在使用的任何外部資源被立即釋放。 – Behrang 2010-04-25 15:32:04