无法连接到 SQL Server 会话数据库

ton*_*dee 5 c# sql-server asp.net session-state

我的 asp.net 应用程序每天都运行良好。直到上个月,我的网络开始出现 2-3 次 Sqlsession 状态服务器的问题,如下所示:

Blockquote System.Web.HttpException 类型“System.Web.HttpException”的异常被抛出。在 System.Web.HttpAsyncResult.End() 在 System.Web.SessionState.SessionStateModule.EndAcquireState(IAsyncResult ar) 在 System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar) ============ ====================================== 异常:System.Web.HttpException 无法连接到 SQL服务器会话数据库。在 System.Web.SessionState.SqlSessionStateStore.ThrowSqlConnectionException(SqlConnection conn, Exception e) 在 System.Web.SessionState.SqlSessionStateStore.SqlStateConnection..ctor(SqlPartitionInfo sqlPartitionInfo) 在 System.Web.SessionState.SqlSessionStateStore.GetConnection(String id, Boolean& usePooling ) 在 System.Web.SessionState.SqlSessionStateStore。DoGet(HttpContext context, String id, Boolean getExclusive, Boolean&locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actionFlags) at System.Web.SessionState.SqlSessionStateStore.GetItemExclusive(HttpContext context, String id, Boolean&locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actionFlags) 在 System.Web.SessionState.SessionStateModule.GetSessionStateItem() 在 System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(Object state) ====================== ============================ 异常:System.InvalidOperationException 超时。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。在 System.Data.ProviderBase。

然后我开始查看我的会话数据库服务器,并在我的 sql 客户端中执行了“exec sp_who”,结果发现了很多 AspState 操作的记录。

我不知道是什么导致了这种问题,因为我们确实在应用程序中没有改变任何严重的事情,只是修复了一些错误。

以下是我的 Web 应用程序环境的详细信息:

asp.net 3.5(从 1.1 转换)...在会话状态为 sqlmode 的 2 个服务器场中运行良好。

有没有人知道这个问题或对调查有任何想法?谢谢

小智 5

自从这篇文章第一次被提出以来已经有一段时间了,但我最近在生产环境中遇到了这个确切的问题,并认为它将来可能对其他人有用。

我们有一个 ASP.NET MVC Web 应用程序在 .NET 4.5.2 上运行,在两个节点之间进行负载平衡。该应用程序被配置为将会话存储在 SQL Server 2012(版本 11.0.5058.0)上的 ASPState 数据库中。我们受到间歇性超时的困扰:

异常信息:异常类型:HttpException 异常消息:无法连接到 SQL Server 会话数据库。超时已过。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且达到了最大池大小。

我相信,这里关于确保代码库中没有其他连接泄漏的一些答案是误导性的。为每个不同的连接字符串创建一个连接池,因此对与其他数据库的连接的任何修复都不会对会话状态数据库产生有益的影响。

我们通过两个更改解决了这个问题:

  1. 通过覆盖 web.config 文件中连接字符串中的默认值 100 来提高最大池大小:

      sqlConnectionString="data source=SERVERNAME;Initial Catalog=AspState;user id=AspStateUser;password=xxxxx;App=xxxx; Max Pool Size=200;" 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 很明显,AspState 数据库是使用 .NET 2.0 命令行创建的,重要的是,dbo.DeleteExpiredSessions SP 存在已知的阻塞问题。为了进一步加剧问题,该作业被配置为每分钟执行一次此过程。AspState 数据库是使用 .NET 4.0 命令行重新创建的,如下所示:

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -ssadd - sstype c -S OURSERVERNAME -d "AspState" -E

至关重要的是,更高版本包括性能改进版本的 DeleteExpiredSessions 过程,该过程包含一个游标,一次删除一个过期会话。我们还将相关作业的时间表更改为每小时而不是每分钟执行一次。


kd7*_*kd7 2

当开发人员使用大量 SqldataReaders 获取数据来构建某种仪表板时,我看到过这个确切的错误发生,但他从未关闭他的数据读取器,即使他将命令行为设置为 CloseConnection。一旦他这样做了(通过使用块的封闭),这些就消失了。同样,这可能不是问题的实际原因,但连接池耗尽通常表明连接未正确关闭。