我的 ASP.NET 应用程序每天都运行良好。
直到上个月,我的网络开始出现 2-3 次 SqlSession 状态服务器问题
跟随:
块引用
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,异常 e) 在 System.Web.SessionState.SqlSessionStateStore.SqlStateConnection..ctor(SqlPartitionInfo sqlPartitionInfo) 在 System.Web.SessionState.SqlSessionStateStore.GetConnection(字符串 id,Boolean& usePooling )在System.Web.SessionState.SqlSessionStateStore.DoGet(HttpContext上下文,字符串id,布尔getExclusive,布尔&锁定,TimeSpan&lockAge,对象&lockId,SessionStateActions&actionFlags)在System.Web.SessionState.SqlSessionStateStore.GetItemExclusive(HttpContext上下文,字符串id, Boolean&locked,TimeSpan&lockAge,Object&lockId,SessionStateActions&actionFlags)在System.Web.SessionState.SessionStateModule.GetSessionStateItem()在System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(对象状态)============ ======================================== 异常:System.InvalidOperationException 超时已过期。从池中获取连接之前超时时间已过。发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小。在System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)在System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)在System.Data.SqlClient.SqlConnection.Open()在System.Web.SessionState。 SqlSessionStateStore.SqlStateConnection..ctor(SqlPartitionInfo sqlPartitionInfo)
然后我开始查看我的会话数据库服务器并在我的sql客户端中执行“exec sp_who”,结果发现了很多AspState操作的记录。
我不知道是什么导致了这种问题,因为我们确实没有改变任何严重的事情
在我们的应用程序中,只修复了一些错误。
以下是我的 Web 应用程序环境的详细信息:
asp.net 3.5(从 1.1 转换)... 工作得很好
2 个服务器场采用 sqlmode 会话状态。
有谁知道这个问题或有任何调查想法?
谢谢
自从这篇文章首次提出以来已经有一段时间了,但我最近在生产环境中遇到了这个确切的问题,并认为它将来可能对其他人有用。
我们有一个在 .NET 4.5.2 上运行的 ASP.NET MVC Web 应用程序,在两个节点之间实现负载平衡。该应用程序配置为将会话存储在 SQL Server 2012(版本 11.0.5058.0)上的 ASPState 数据库中。我们遇到了间歇性超时的问题:
异常信息:
异常类型:HttpException
异常消息:无法连接到 SQL Server 会话数据库。
超时已过。从池中获取连接之前超时时间已过。发生这种情况的原因可能是所有池连接都在使用中并且已达到最大池大小。
我认为,这里有关确保代码库中没有其他连接泄漏的一些答案是误导性的。为每个不同的连接字符串创建一个连接池,因此对其他数据库连接的任何修复都不会对会话状态数据库产生有益的影响。
我们通过两项更改解决了这个问题:
-
通过覆盖 web.config 文件中连接字符串中的默认值 100 来提高最大池大小:
sqlConnectionString="data source=SERVERNAME;Initial Catalog=AspState;user id=AspStateUser;password=xxxxx;App=xxxx; Max Pool Size=200;"
很明显,AspState 数据库是使用 .NET 2.0 命令行创建的,重要的是,dbo.DeleteExpiredSessions SP 存在已知的阻塞问题。为了使问题更加复杂,该作业被配置为每分钟执行此过程。使用 .NET 4.0 命令行重新创建 AspState 数据库,如下所示:
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -ssadd
- sstype c -S 我们的服务器名称 -d "AspState" -E
重要的是,更高版本包括一个性能改进版本的DeleteExpiredSessions 过程,其中包含一个可以一次删除一个过期会话的游标。我们还将相关作业的时间表更改为每小时执行一次,而不是每分钟执行一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)