2017-05-29 67 views
1

目前我遇到了很多服務器進程問題(從sp_who2中看到)「睡眠」,而不僅僅是,完成(被刪除),當我連接到我的MSSQL數據庫,調用存儲過程,獲取一些數據和然後關閉連接。如何避免MSSQL中的「睡眠」進程?

在C#/ .NET中連接到MSSQL數據庫,調用存儲過程,從存儲過程(數據讀取器)檢索數據,然後關閉連接的最佳方式是什麼?

有沒有辦法關閉/處置,使「睡眠」進程被殺害?

它與我創建新的SqlConnections,打開它們並關閉他們有什麼關係嗎?

我的流程如下:

請求發生:

  1. 我創建了一個新的SqlConnection實例連接到我的MSSQL數據庫。
  2. 我調用一個存儲過程,檢索數據並將其呈現給用戶。
  3. 我關閉連接.Close();
  4. 我重複所有這些步驟爲每個請求。請求每5-10秒發生一次。 (有時更慢,有時更快)

對不起如果這個問題缺少一些細節,但我希望這足以得到一些有用的答案。

謝謝!

+3

這是正常現象 - 連接池和其數量始終保持可用,以最大限度地減少設置物理連接的開銷。關閉連接並不會真的關閉它,它只是讓它再次可用於池。你遇到的是什麼「問題」?活動會話的數量是否真的在增加,或者您是否認爲存在錯誤,因爲這些會話都存在?您的一般用法是正確的,但不是明確調用'.Close()',而是''使用':即使面對異常,這也是安全的。 –

+0

@JeroenMostert我會張貼它作爲答案,添加一個鏈接到msdn文檔的主題https://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx – bradbury9

+0

我的假設有些事情是錯誤的,就是當很多「睡眠」進程中,數據庫變得越來越慢,當我試圖清除這些「睡眠」進程時,數據庫變得更快。這只是一個假設嗎? –

回答

0

你需要使用SET XACT_ABORT ON或當客戶端超時事件發生(.NET的CommandTimeout例如),客戶端發送一個「中止」到SQL Server添加一些客戶端代碼回滾

。 SQL Server然後簡單地放棄查詢處理。沒有事務回滾,沒有鎖被釋放。

現在,連接返回到連接池,所以它不會在SQL Server上關閉。如果發生這種情況(通過KILL或客戶端重新啓動等),那麼交易+鎖將被清除。請注意,sp_reset_connection不會或不會清除它們,即使它被廣告這樣做

來自中止的碎片會阻止其他進程。

使SQL Server清除客戶端超時(嚴格來說,ABORT事件)事務+鎖定的方法是使用SET XACT_ABORT ON。

您可以驗證這一點可以在SSMS出口2個查詢窗口:

窗口1:

在菜單查詢..查詢選項設置爲5秒的超時然後運行這個

BEGIN TRAN 
UPDATE sometable WITH (TABLOCKX) SET foo = foo WHERE 1 = 0; 
WAITFOR DELAY '00:00:10' -- just has to be longer then timeout 

窗口2,這將永遠等待(或打你超時)

SELECT * FROM sometable