2016-04-13 38 views
0

我有一個在Windows Azure上運行的ASP.NET MVC應用程序和SQL Azure。該應用程序使用SqlClient連接到數據庫。我總是使用相同的connectionString(要使用連接池):緩慢 - 打開和關閉連接到SQL Server

 using (SqlConnection conn = new SqlConnection("Static Connection String")) 
     { 
      using (var command = conn.CreateCommand()) 
      {      
       conn.Open(); 
       return command.ExecuteNonQuery(); 
      } 
     } 

我注意到,有是在離開執行緩慢的連接開口之間相當長的時間。例如,如果我有一個包含四個選擇列表的頁面,則應用程序需要打開連接四次以填充列表。如果您使用一個命令執行此操作,並返回所有列表,則性能是令人難以置信的,但是當我打開並關閉連接以單獨獲取結果列表時,性能也會下降。

使用Windows窗體應用程序不會發生。

我的疑問是,對我所在的環境有任何限制嗎?

+0

是否有您無法保持連接打開的原因?此外,有時在調試模式下運行應用程序的速度可能會比發佈速度慢得多,該版本具有優化功能 –

+1

@PhilippeParé保持連接打開只會產生重大問題。 ADO.NET使用連接池,因此它不*必須打開新的連接。相反,它重用以前關閉的連接。 –

+2

問題是,你執行4個查詢,而不是你打開4個連接 - 你不知道。連接池意味着您可以重複使用相同的連接。儘管如此,你仍然需要向服務器發送請求,等待並找回答案。這是4次往返會導致性能下降。無論如何,4個查詢最多比單個查詢慢4倍。如果檢索的數據很小,則往返開銷比查詢本身更昂貴 –

回答

1

問題是,你執行4個查詢,而不是你打開4個連接 - 你不知道。連接池意味着您可以重複使用相同的連接。

雖然您仍然需要向服務器發送請求,請等待並找回答案。這是4次往返會導致性能下降。無論如何,4個查詢最多比單個查詢慢4倍。如果檢索的數據很小,則往返開銷比查詢本身更昂貴。

你應該儘量減少數據庫調用或完全消除它們:

  • 使用批處理將多個查詢組合成一個單一的電話。
  • 使用緩存查找數據,以便您不必一直檢索相同的選擇。
  • 最後,如果請求參數不更改,請使用輸出緩存來避免呈現相同的頁面。