超過 100 個連接到處於“睡眠”狀態的 sql server 2008
我在這裡遇到了大麻煩,在我的伺服器上。
我的伺服器上執行著一個 ASP .net Web(框架 4.x),所有的事務/選擇/更新/插入都是用 ADO.NET 完成的。
問題是,在使用了一段時間後(幾次更新/選擇/插入),有時在使用此查詢檢查 sql server 上的連接時,我會獲得超過 100 個處於“睡眠”狀態的連接:
SELECT spid, a.status, hostname, program_name, cmd, cpu, physical_io, blocked, b.name, loginame FROM master.dbo.sysprocesses a INNER JOIN master.dbo.sysdatabases b ON a.dbid = b.dbid where program_name like '%TMS%' ORDER BY spid我一直在檢查我的程式碼並在每次建立連接時關閉,我將測試新類,但恐怕問題沒有得到解決。
它假設連接池,保持連接重用它們,但直到我看到不要總是重用它們。
除了檢查關閉所有使用後打開的連接之外還有什麼想法嗎?
已解決(現在我在“睡眠”狀態下只有一個漂亮的連接):
除了David Stratton的 anwser 之外,我還想分享這個連結,它有助於很好地解釋連接池是如何工作的: http: //dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and。 html
簡而言之,您需要關閉每個連接(sql 連接對象),以便連接池可以重新使用連接並使用相同的 connectinos 字元串,以確保強烈推薦使用其中一個 webConfig。
小心 dataReaders 你應該關閉它的連接(這讓我很生氣)。
聽起來像是連接池。
從這裡:http: //msdn.microsoft.com/en-us/library/8xx3tyca.aspx
為每個唯一的連接字元串創建一個連接池。創建池時,會創建多個連接對象並將其添加到池中,以滿足最小池大小要求。連接會根據需要添加到池中,直至指定的最大池大小(預設值為 100)。當連接被關閉或釋放時,它們會被釋放回池中。
為確保您沒有創建不必要的池,請確保每次連接時使用完全相同的連接字元串 - 將其儲存在 .config 文件中。
如果您願意,還可以減小最大池大小。
實際上,我建議您只閱讀上面連結的整篇文章。它討論了清理池,並為您提供了正確使用池的最佳實踐。
編輯 - 第二天添加
由於連接池的工作方式,伺服器上的池在那裡。根據上面連結的文件:
連接池程序在連接池長時間空閒後,或者如果池程序檢測到與伺服器的連接已被切斷,則從池中刪除連接。請注意,只有在嘗試與伺服器通信後才能檢測到斷開的連接。如果發現不再連接到伺服器的連接,則將其標記為無效。無效連接僅在關閉或回收時才會從連接池中刪除。
這意味著伺服器本身最終會清理這些池,如果它們仍然未被使用的話。如果沒有清理,則意味著伺服器認為連接仍在使用中,並且正在使用它們以提高您的性能。
換句話說,除非您發現問題,否則我不會擔心。連接池正按應有的方式發生。
如果您真的想再次根據文件清除池:
清理池
ADO.NET 2.0 引入了兩種清除池的新方法:ClearAllPools 和 ClearPool。ClearAllPools 清除給定提供程序的連接池,ClearPool 清除與特定連接關聯的連接池。如果在呼叫時有正在使用的連接,它們會被適當地標記。當它們關閉時,它們被丟棄而不是返回到池中。
但是,如果要調整池化,可以修改連接字元串。請參閱此頁面,然後搜尋單詞“pool”:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx
或者,您可以招募 DBA 來協助和設置伺服器級別的池。這是題外話,但 ServerFault.com 可能會有人在那裡提供幫助。