2013-05-06 37 views
1

我的C#代碼使用SqlConnection連接到SQL Azure。有時我會面對以下幾點:我如何知道實際的SQL Server客戶端連接池利用率?

System.InvalidOperationException 
Timeout expired. The timeout period elapsed prior to obtaining a connection 
from the pool. This may have occurred because all pooled connections were 
in use and max pool size was reached. 
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(
    DbConnection owningConnection) 
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(
    DbConnection outerConnection, DbConnectionFactory connectionFactory) 
at System.Data.SqlClient.SqlConnection.Open() 
// my code calling SqlConnection.Open() 

我想找到爲什麼我面臨這個例外。這個例外可能是因爲我已經耗盡了連接池,但我不完全確定,如果我確定我想知道我是如何到達那裏的。

我的代碼可以獲得最大池大小和當前池利用率(已用和未用連接數)嗎?

+0

[最大池大小設置和聯合會在Windows Azure中的SQL數據庫(http://blogs.msdn.com/b/cbiyikoglu/archive/2012/09/07/max-pool- size-setting-and-federations-in-windows-azure-sql-database.aspx) – Habib 2013-05-06 11:07:46

+0

@Habib:那是每個連接,它並沒有說我已經有多少個連接。 – sharptooth 2013-05-06 11:10:14

回答

0

您可以結帳這link

雖然最大池大小,如果沒有指定,爲100。

+0

這並沒有說任何關於正在使用的連接數量。 – sharptooth 2013-05-06 11:45:48

+0

剛剛提供了有關** Exception **的某些信息的鏈接,以便您可以解決問題。但是,沒有指定如何通過代碼檢測池大小。 – Lucky 2013-05-07 05:00:25

+0

我不想「解決我的問題」,我想知道利用率。 – sharptooth 2013-05-07 05:49:22

2

爲SQL天青數據庫連接的最大數目爲180間的連接。這是一個硬性限制。

http://msdn.microsoft.com/en-us/library/windowsazure/ff394114.aspx

 
-- monitor connections 
SELECT 
     e.connection_id, 
     s.session_id, 
     s.login_name, 
     s.last_request_end_time, 
     s.cpu_time 
FROM 
     sys.dm_exec_sessions s 
     INNER JOIN sys.dm_exec_connections e 
     ON s.session_id = e.session_id 
GO 

這個查詢將允許查看當前連接。上面的鏈接也有一些非常有用的查詢來確定連接來自哪裏。

我使用這個查詢作爲診斷設置和報告的一部分,我們在cron作業中運行以確保我們不會停機。

已經指出的最大池將有所幫助,但這取決於SQL Azure前面的計算數量。

當你遇到這種類型的問題時,你需要弄清楚如果你在關閉方面存在連接問題,或者你需要開始查看更高級的解決方案,比如分片。

HTHS,詹姆斯

相關問題