2015-05-13 152 views
1

我正在一個由十幾位開發人員組成的小團隊中,這個團隊是使用C#WPF作爲基礎結構/ dba編寫的。由於我對運行SQL Server跟蹤,看看性能是怎麼回事,我所看到的是一個常數:打開和關閉連接到SQL Server

開放連接 運行一些語句 緊密結合 的exec sp_reset_connection的

開放連接 運行一些語句 密切聯繫 的exec sp_reset_connection的

開放連接 運行一些語句 緊密結合 的exec sp_reset_connection的

等等等等。我已經和開發人員討論過這個問題,有些人提到了foreach循環可能包含使用語句的可能情況,因此通過數據表的foreach可以打開和關閉整個數據表內容的連接。

問:越來越恆開的更好的控制和連接關閉一個有價值的目標或爲連接真的那麼便宜?我的邏輯是,雖然打開和關閉連接可能相對便宜,但如果數量足夠多,則沒有什麼是便宜的。

詳情:

  • .Net框架4.5.1
  • 的SQL Server 2014
  • 實體框架6

回答

0

打開和關閉到數據庫的連接是比較昂貴的,因爲可以在這裏詳細閱讀:Performance Considerations (Entity Framework),但我認爲相同的概念主要是適用無EF。在循環期間,通常不建議每次打開和關閉連接,而是打開它,處理所有行並關閉連接。

答案是讓using涵蓋,而不是周圍的其他方式的循環。如果性能是相關的(幾乎總是這樣),那麼在開發過程的早期就需要投入有效的數據訪問。

1

如果使用實體框架,你應該在你面前創建上下文需要它,並儘快處置它可能:

using (var someContext = new SomeContext()) 
{ 

} 

原因是爲了避免內存堆積和避免線程安全問題。

當然,不要在循環中這樣做 - 這是在請求的級別。

0

如果性能是一個問題,但你不想重構代碼,你應該考慮在連接字符串中設置ConnectionPooling = true

連接池允許一個保持物理連接,這通常是昂貴的設置,而設置邏輯連接。