10

我在這裏有一個很大的麻煩,以及我的服務器。超過100個連接到SQL Server 2008的「睡眠」狀態

我有一個運行在我的服務器上的ASP.netnet(框架4.x),所有的事務/選擇/更新/插入都是用ADO.NET製作的。

的問題是,使用了一段時間(一對夫婦的更新/選擇/刀片)爲後有時我得到了「睡眠」狀態超過100個連接時,檢查與此查詢的SQL服務器上的連接:

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 

我一直在檢查我的代碼並關閉每次我建立連接時,我要測試新的類,但是恐怕問題沒有解決。

它假設連接池,保持連接重新使用它們,但直到我看到不總是重複使用它們。

任何想法除了檢查關閉所有連接後使用它們打開?

解決(現在我只是一個和「睡眠」狀態美麗的連接):

除了大衛·斯特拉頓的anwser,我想和大家分享這個環節,有助於解釋真的很好如何連接池的工作原理:http://dinesql.blogspot.com/2010/07/sql-server-sleeping-status-and.html

只是要短,你需要關閉,以便連接池可以重新使用該連接,並使用相同connectinos字符串中的每個連接(SQL連接對象),以確保本強烈推薦使用其中一個webConfig。

小心dataReaders,你應該關閉它的連接(這是讓我瘋了一段時間)。

+0

在[dba.stackexchange.com](http://dba.stackexchange.com)上,您可能會得到更多更好的答案,其中全職DBA掛出 –

回答

16

這聽起來像是連接池。

從這裏:爲每個唯一的連接字符串創建http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

連接池。當創建一個 池時,將創建多個連接對象並將其添加到該池的 ,以滿足最小池大小要求。 根據需要將連接添加到池中,直到指定的最大池大小 (默認值爲100)。當關閉或丟棄連接時,連接會被釋放回池中。

爲確保您不會創建不必要的池,請確保每次連接時都使用完全相同的連接字符串 - 將其存儲在.config文件中。

如果願意,還可以減少最大池大小。

其實,我建議你只是閱讀上面鏈接的整篇文章。它討論清理池,併爲您提供正確使用池的最佳實踐。

編輯 - 添加第二天

您的服務器上的池那裏,因爲連接池是如何工作的。每掛上面的文檔:

的的連接池去除池中的連接已 空閒了很長一段時間後,或者如果池程序檢測到與服務器的 連接已中斷。請注意,只有在嘗試與服務器的 通信後才能檢測到連接斷開的 。如果發現連接不再連接到服務器 ,則該連接被標記爲無效。僅當關閉或回收連接池時,將無效連接從連接池中刪除 。

這意味着服務器本身最終會清理這些池,如果它們仍未使用。如果未清理,l表示服務器認爲連接仍在使用中,並掛在它們上以提高性能。

換句話說,我不會擔心它,除非你看到一個問題。連接池正在發生。

如果你真的想清除池中,再次,每個文檔:

清除池

ADO.NET 2.0引入了兩個新的方法來 明確池:ClearAllPools和ClearPool。 ClearAllPools將清除給定提供者的連接池 ,ClearPool將清除與特定連接關聯的連接池 。如果 在通話時有連接正在使用,則標記爲 。當它們被關閉時,它們被丟棄,而不是被返回到池中的 。

但是,如果要調整池,則可以修改連接字符串。看到這個頁面,搜索單詞「池子」:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

或者你可以爭取一個DBA協助,並設置在服務器級別的彙集。這是關鍵問題,但ServerFault.com可能會有人在此提供幫助。

+0

嗨,在問我最終閱讀那篇文章之前。但是,對於同一個連接字符串,你的意思是什麼?你的意思是「對象」還是字符串,我會嘗試使用webConfig而不是類中的屬性。 我可以在哪裏限制連接池? 謝謝。 – Allende

+0

我想所有的答案都在這裏http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx我很抱歉。我要檢查一下並最終更新問題。 – Allende

+0

我不能找出正確的方式來使用「相同的連接字符串」,我現在使用它從網絡配置,並仍然獲得狀態「睡眠」很多連接 – Allende