2008-11-10 24 views
22

當我使用SQL Server Profiler分析我的申請,我看到很多審覈登錄審覈註銷消息到同一數據庫的連接。我想知道,這是否表明我的連接池有問題?我之所以要問,是因爲我發現這個MSDN文檔中關於連接池:SQL連接池和審覈登錄/註銷

登錄和註銷事件將不會引發在服務器上 當連接 爲獲取或返回 連接池。這是因爲 連接在 返回到連接池時並未實際關閉。 有關詳細信息,請參閱審計登錄 事件類和審計註銷事件 SQL Server聯機叢書中的類。

http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

此外,沒有任何人有確定連接池是如何有效針對給定的SQL服務器的任何提示?我在單個服務器上有很多數據庫,我知道這可能會產生巨大的影響,但我想知道是否有一種簡單的方法可以獲得有關連接池效率的指標。提前致謝!

回答

14

請記住,連接是按每個連接字符串合併的。如果您有很多數據庫並使用多個連接字符串進行連接,則當應用程序不存在正確的連接字符串時,您的應用程序將創建一個新連接。然後它會將該連接池化,如果池已滿,則會衝擊現有連接。默認Max Pool Size是100個連接,所以如果您經常在100多個數據庫中彈跳,則會一直關閉並打開連接。

這並不理想,但您可以通過始終連接到單個數據庫(一個連接字符串)然後切換數據庫上下文'USE [DBName]'來解決問題。存在缺陷:

  • 您失去了指定每個連接字符串的用戶/傳遞(您的應用程序用戶需要對所有數據庫的權限)的能力。
  • 您的SQL變得更加複雜(特別是如果您使用的是開箱即​​用的ORM或存儲過程)。

如果您的數據庫數量不是很大,您可以嘗試增加最大池大小。否則,如果某些數據庫經常使用,而其他數據庫不常用,則可以在不頻繁的dbs上關閉數據庫。這兩項都是通過connectionstring配置的。

就指標而言,監控SQL Server上的登錄和註銷事件是一個好的開始。如果你的應用程序集合得很好,你不應該看到很多。

+0

這爲我澄清了很多。謝謝。也許你可以幫助我解決這個問題:當達到最大池大小時拋出一個池連接的應用程序與拋出「達到最大池大小」的異常之間有什麼區別? – motto 2010-03-11 15:56:08

+0

@motto - 當連接未關閉時,您會看到「最大池大小...」異常。即使有游泳池,也需要關閉連接以將其返回游泳池。如果不在「最終」或「使用」塊中,異常可能會阻止您的.Close調用運行:http://blogs.msdn.com/tolong/archive/2006/11/21/max-pool-size-是-reached.aspx。請記住,某些命令或適配器調用使用隱式連接,並且需要安全關閉。另外,請注意在循環中創建DB對象。 – 2010-03-12 01:43:45

30

雖然MSDN文章說,該事件將只提高了非重用的連接,SQL Server文檔違背了這一說法:

「審覈登錄事件類指示用戶已成功登錄到微軟SQL Server。此類中的事件由新連接或從連接池重用的連接觸發。「

衡量池的有效性的最好方法是收集連接時間和無池時間。通過池化,您應該看到第一個連接速度很慢,而後續連接速度非常快。如果沒有合併,每個連接都需要很長時間。

如果要跟蹤審覈登錄事件,則可以使用EventSubClass數據列來確定登錄是否具有重用連接或新連接。對於真實連接,值爲1,對於來自pool.application的重用連接,值爲2。