2012-03-22 121 views
-1

我正在將Foxpro遷移到ASP.NET MVC應用程序。的邏輯的連接太多Asp.net

近70%被嵌入在SqlServer的存儲過程。出於這個原因,我們正在使用一些過程來更新某些表(我們不映射SP,只需使用SqlConnection和SqlDataReader,SqlCommand,SqlAddapter調用它們)。

問題是,每次通話都會打開很多連接。即使這樣,每次通話都會關閉連接。當運行sp_who時,許多連接似乎爲同一用戶打開。

執行關閉和處理每個連接的當前方式是什麼?

可以找到一個活動的連接並重用它?

最後的嘗試是:

SqlConnection.ClearAllpools(); 

不過,這並不立即生效。 我們有一個執行連接的IDisposabel類連接。 這是de close方法:

public void close() 
{ 
    SqlConnection.ClearAllPools(); 
    //.ClearPool(BdTransCx); 
    // SqlConnection.ClearPool(BdArchCx); 

    if (ConectarArchivos) 
    { 
     if (BdArchCx.State == ConnectionState.Open) 
     { 
      BdArchCx.Close(); 
     } 
    } 
    if (BdArchCx.State == ConnectionState.Open) 
    { 
     BdTransCx.Close(); 
    } 
} 

在每次請求後調用此方法。

+1

關閉一旦你完成它的連接。看看[using-statement](http://msdn.microsoft.com/en-us/library/yh598w02.aspx)。連接池假定當你沒有關閉連接時不能重用連接。請記住,關閉只是池的標誌,實際上與數據庫的連接保持打開狀態,以便儘快重用。如果池中的每個連接都處於使用狀態(打開),池會創建一個新的物理連接,這非常昂貴。它是否達到MaxPoolSize(默認值爲100),你會得到你的例外。 – 2012-03-22 15:50:46

+0

很tks。你正在談論的關閉方法是SqlConnection.close()?或者必須是:using-statement? – 2012-03-22 15:58:22

+0

假設'BdArchCx'是'SqlConnection':'BdArchCx。關閉()'在最後一個try/catch的塊類似於'使用(VAR BdArchCx =新的SqlConnection(conString)){}''因爲將using'調用'dispose'這隱含關閉連接。儘快處置實現「IDisposable」的每個對象是一種很好的做法。 – 2012-03-22 16:01:43

回答

2

You should wrap your SqlConnection objects, and any SqlCommand objects in a using block

using (SqlConnection cn = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand cm = new SqlCommand(commandString, cn)) 
    { 
     cn.Open(); 
     cm.ExecuteNonQuery(); 
    } 
} 

有關詳細信息,請參閱.NET "Your Friend the C# Using Statement."

+0

韓國社交協會您的快速解答....這代碼表示連接inmediatly配置? – 2012-03-22 15:52:41

+0

是的。 **但是**您必須以相同的方式考慮閱讀器處置。 – Pankaj 2012-03-22 16:08:01

2

連接彙集,所以這是正常的看到一些連接仍處於數據庫的活動。

你不應該試圖殺死連接池,這會殺了性能。有一個池的原因是它的許多重新使用連接比每次建立一個新的連接更快。

只要確保你關閉每個連接,每個命令正確,讓他們返回到池中。您可以使用using塊,以確保它們被正確配置無論發生什麼情況:

using (SqlConnection connenction = ...) { 
    using (SqlCommand command = ...) { 
    ... 
    } 
} 
1

請務必保持讀者,以及在使用聲明,以避免連接問題

using (SqlConnection cn = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand cm = new SqlCommand(commandString, cn)) 
    { 
     cn.Open(); 
     using (IDataReader dr = cm.ExecuteReader()) 
     { 
     } 
    } 
} 
+0

你仍然應該調用cn.Close();這比等待對象被垃圾收集要快。 – NickG 2012-08-23 15:57:33