Asp.Net中的Session问题

1 asp.net iis-6 sql-server-2005 session-state

我们有一个运行我们应用程序的IIS 6服务器的Web场.
我们的会话存储在不同服务器上的Sql Server 2005上.

每隔几个月我们就会在其中一个Web服务器日志中收到此错误:"超时已到期.在从池中获取连接之前已经过了超时时间.这可能是因为所有池连接都是使用的并且最大池大小到达了"

堆栈跟踪:System.Data.ProviderBase.DbConnectionFactory.GetConnnection(DbConnection owningConnection)中的System.Data.ProviderBase.DbConnectionInternal GetConnection(System.Data.Common.DbConnection),位于System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory) )在Systme.Web.SessionState.SqlSessionStateStore.SqlStateConnection..ctor(SqlPartitionInfo sqlPartitionInfo)的System.Data.SqlClient.SqlConnection.Open()处

抛出此异常时,服务器开始表现得很奇怪 - 有些用户可以访问应用程序而有些用户无法访问.

到目前为止我们找到的唯一解决方案是重置该服务器上的IIS.

我还应该指出,在发生这种情况之前,服务器不会出现过载并且性能很正常.

有任何想法吗?

The*_*des 5

这是糟糕的资源管理的经典之作.如果您使用带有SQL的自定义会话管理器(模块),那么您没有正确处理连接,并且应用程序池的连接已用尽.然后所有后续连接都在等待连接自动处理; 这是发生超时的地方.

但是,这可能不是您的问题,因此您需要做的是限制连接的超时时间:

重负荷超时

如果您的Web服务器负载很重,那么增加会话状态访问的超时可能会很有用.您可以将stateNetworkTimeout属性添加到web.config和machine.config中的sessionState设置

如果Web服务器或状态服务器处于压力之下且无法按时完成会话访问,则事件日志中可能会记录事件ID 1072和事件ID 1076.

http://idunno.org/articles/277.aspx

此外, 您应该只将SessionState用于基本数据类型,如string,int,bool如果要存储大量信息或复杂数据类型,可能需要重新确定存储在那里的内容和原因.

您应该考虑使用Cache或Viewstate.互联网上有很多这样的文章,例如:http: //www.codeproject.com/KB/session/exploresessionandcache.aspx

由于您的会话状态是基于SQL的,并且这是最慢的模式,因此您应该尽可能地尝试使用它.也许您可以使用唯一键将值存储在缓存中,并将唯一键存储在会话变量中.存在许多变通方法.

另一个更有用的链接:http: //devshop.wordpress.com/2008/04/10/how-to-choose-from-viewstate-sessionstate-cookies-and-cache/