网站停止响应,因为SQL Server连接池耗尽

时间:2017-11-01 05:24:00

标签: c# asp.net sql-server iis connection-pooling

我读过:

但是我没有更接近理解或解决我的问题,如下所示。我已经发布在这里,而不是在dba.stackexchange.com,没有其他原因,我相信这将获得更大的读者。

这也不是典型的确保您使用using子句关闭连接,无论存储的proc是从SQL Agent,SQL Server Management Studio还是通过不是ASP.NET应用程序的外部应用程序运行的看到这种行为。

我的环境如下:

  • SQL Server 2012 - 11.0.2100.60(X64)标准
  • Windows Server 2008 SP2,IIS 7

SQL Server和IIS都在同一台机器上运行。

我有以下间歇性问题,其中特定存储过程运行资源密集型(绝对是CPU 100%,I / O很难测量),偶尔会导致Web表单应用程序停止响应请求。

webforms应用程序在其自己的应用程序池中运行(默认设置为最多100个数据连接),恢复方式的方法是重新启动清理连接池的应用程序池。很偶然,如果你等待足够长的时间(例如5分钟以上),连接数会下降并且事情会恢复,但这并不一致。

为了将此存储过程与webforms应用程序隔离,我更改了存储过程的连接字符串,以便它具有自己的应用程序名称,因为我认为(从我的阅读中)它将阻止它干扰webforms应用程序但是行为持续存在,我在事件日志中看到以下内容:

其中一些:

Exception information: 
    Exception type: EntityException 
    Exception message: The underlying provider failed on Open.

最终跟随(一段时间后):

Exception information: 
    Exception type: InvalidOperationException 
    Exception message: 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.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)

此时网站已停止提供请求。通过以下方式查看SQL Server报告的内容:

SELECT COUNT(*) FROM sys.dm_exec_sessions

我看到比平常更多的连接数。

所以假设我没有机会改变存储过程,任何人都可以告诉我这里发生了什么,因为很明显我的理解存在一些差距。如果可能的话,我该如何解决这个问题?

0 个答案:

没有答案