2010-11-06 99 views
31

如果連接到數據庫會消耗大量資源,那麼爲什麼要在應用程序中始終關閉數據庫連接(如果必須再次打開它)呢?我可以在整個應用程序中使這個連接全局可用,以便其他類和方法可以重用它嗎?爲什麼總是關閉數據庫連接?

例如(在僞代碼):

public class PopulateGridViews() 
{ 
    public SqlConnection conn = new SqlConnection(@"Database:DATABASE"); 
    conn.Open(); 

    void PopulateGrid1() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE1"); 
     cmd.Connection = conn; 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     // Populate Grid1 
    } 

    void PopulateGrid2() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE2"); 
     cmd.Connection = conn; 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     // Populate Grid2 
    } 
} 
+0

我建議閱讀[SQL Server連接池(ADO.NET)](http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx)。 – 2010-11-06 02:44:36

回答

45

你不應該離開連接打開。

您應該:

  1. 打開儘可能晚地
  2. 關閉連接儘快

連接本身的連接返回到連接池。連接是有限且相對昂貴的資源。您建立的任何新連接都具有正好相同的連接字符串將能夠重新使用池中的連接。

我們強烈建議您始終 關閉連接,當你 使用它,以便 連接將被返回到 池完成。您可以使用連接對象的 連接對象的 Close或Dispose方法,或通過在C#中使用語句 或Visual Basic中的Using語句中打開所有 連接來完成此操作。不明確關閉 的連接可能不會被添加 或返回到池中。有關更多 信息,請參閱使用語句(C# 參考)或How to:Dispose of a System Resource for Visual Basic。 Ref

你應該適當地換任何一個using語句塊實現IDisposable

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    ... 

    command.ExecuteNonQuery(); 
} 
+0

如果在連接過程中發生錯誤,我應該在哪裏放置捕獲物? – yonan2236 2010-11-06 02:53:34

+1

如果您使用@Mitch Wheat建議的使用塊,如果出現錯誤,它將自動關閉。 – David 2010-11-06 02:59:40

+0

所以沒有辦法確定知道發生的錯誤? – yonan2236 2010-11-06 03:04:29

6

因爲(一些)數據庫也撐開連接,直到通過調用應用程序告知要關閉它。如果你有數百個對數據庫的調用,那麼它就坐在那裏,有100個打開的連接佔用資源。在忙碌的應用程序中有數千或數十萬個數據庫調用並不罕見,數據庫性能遲早會影響應用程序的性能。

這真的只是常識。如果你有一個合理的理由保持開放,那就這樣做。如果沒有,請儘快關閉它。但最好還是保持關閉連接的好習慣,以免在不打算的情況下讓它們打開。這是一個很好的習慣,就像你穿着安全帶或者在你沒有食物時關上冰箱門一樣。

該文章指出得好(哪怕是有點過時):

http://www.bewebmaster.com/84.php

託管 公司的一個共同問題是,ASP網站都不會 關閉 後與數據庫的連接他們被打開。這是 的基本步驟,您應該考慮將其作爲 強制性代碼的一部分。如果您沒有關閉 您的數據庫連接,則可能會出現許多 問題,如網頁掛起,頁面加載速度緩慢等等。

認爲它是通過你的房子到 的大門。也許門本身將自己關閉 ,但也許它不會。如果它 不關閉,誰知道 會發生什麼。如果你住在鄉下,一個 熊可以走。如果你住在 城市,一個搶劫犯可以走進去。好吧, 以及可能留下數據庫 連接開放不會導致任何 說不好,但它會導致很多 不必要的麻煩,你和你的託管公司 。

+1

我們有一個我們在工作中繼承的應用程序泄漏連接,它不是很好:(經過一段時間SQL Server停止響應新的連接,這也意味着其他應用程序停止工作。 – Skurmedel 2010-11-06 02:51:20

相關問題