2013-05-06 53 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,詹姆斯

相关问题