Asp.net 中session存储的三种模式的具体运用
2009-08-11 14:28
330 查看
在Asp.net中Session的存储方式不象asp那样单一,一共提供了三种存储方式,由于最近一个2000多人使用的web软件出现了故障,用户每
天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了.整天都不会出现同样的问题
,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大概20人左右,同时大概100多人在线,以后访问人数还会增加,为了
解决这个怪问题,先从软件着手,故而三种方式都应用了一番。
打开web.config文件
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
其中默认的mode是InProc类型,这种模式和以前ASP模式一样,就是服务器将Session信息存储在IIS进程当中,当IIS关闭、重起后这些进程信息都会丢失,但这种模式的性能最高(具体没测,看书上说),这种模式是ASP.NET的默认方式。
由于这种模式出现了故障,当时我的考虑就是由于访问量过大的原因,导致Inetinfo.exe进程崩溃。用户难以登陆以致Session丢值出现故障,我采用了另外一种Session的存储方式把Session信息存储在进程外。
首先,打开管理工具找到服务,找到名为:ASP.NET State Service的服务,启动它.并且改成自动启动。这时你可以在任务管理器中看到一个名为aspnet_state.exe的进程。这就是我们保存session信息的进程。
然后,回到web.config文件中把Mode的值改为StateServer,保存文件。OK.
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"
cookieless="false"
timeout="20"
/>
这种模式当我们重起IIS,保存的session值不会丢失。另外这种方式还可以把信息保存在其他机器的进程中,不过还要更改 stateConnectionString="tcpip=127.0.0.1:42424",IP地址改为其他机器即可。
另外还采取了其他的措施.比如把数据库和Web服务器分开,数据库服务器不提供WEB服务,Web服务器不提供数据库服务,
然后把连接池扩大,由于ASP.NET中ADO.NET数据访问默认连接池数量为100, 后来我扩大到6000顺便把写法加上来
“Server=(local);Database=rgs;password=sa;user ID=sa;Max Pool Size =6000; Min Pool Size =5;Pooling=True”
最后把Machine.config中的ProcessModel中的memoryLimit改为95,默认为60,表示内存占用超过60%后iis进程会自动重起。接着还做写其它一些优化IIS的方法,把注册表的IIS缓存加大等等 。
当我做完这些优化步骤后,整个软件运行比较良好,第二天没有发现堵塞的现象,但是第三天情况又出现了,实在没办法,我采取了最后一种方法就是将Session存储在SQLServer中,我想这样稳定性应该强些。
要
使用SQLServer中,首先在会话状态的SQLServer的计算机上,运行InstallSqlState.sql或
InstallPersistSqlState.sql(默认位置:systemroot/Microsoft.NET/Framework
/versionNumber下面)两个脚本都创建一个名为ASPState的数据库,两个脚本的差别在于放置
ASPStateTempApplication和ASPStageTempSessions表的位置。InstallSqlState.sql脚本将这
些表添加到TempDB数据库,该数据库在计算机重起时将丢失数据,而InstallPersistSqlState.sql脚本将这些表添加到
ASPState数据库,该数据库重启时保留会话数据。
然后在应用程序的web.config文件中,
把<sessionState>元素的mode属性设置为SQLServer,最后将sqlConnectionString属性设置为
Integrated Security=SSPI;data source=serverName;
<sessionState mode="SQLServer"
sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;"
cookieless="false"
timeout="20"/>
</sessionState>
如果部署在其他机器上可以更改为,加上用户名和密码
<sessionState
mode="SQLServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"
cookieless="false"
timeout="20"
/>
这
样部署完成了,如果不想使用这种可以删除掉,只要在相应的目录(systemroot/Microsoft.NET/Framework
/versionNumber)找到UninstallPersistSqlState.sql或者UninstallSqlState.sql文件运行
即可。
最后要注意的是,无论使用StateServer或者SQLServer模式时,当使用session转换对象时,注意对象要先序列化,就是在类前加上Serializable,否则会出现错误!
当最后这种模式应用后,系统稳定了一段时间 ,目前还没有异常出现,不过,随着软件用户群的增加,这些天还在准备进一步的优化措施。
转载自:http://www.cnblogs.com/mingfei200169/articles/514906.html
天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了.整天都不会出现同样的问题
,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大概20人左右,同时大概100多人在线,以后访问人数还会增加,为了
解决这个怪问题,先从软件着手,故而三种方式都应用了一番。
打开web.config文件
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
其中默认的mode是InProc类型,这种模式和以前ASP模式一样,就是服务器将Session信息存储在IIS进程当中,当IIS关闭、重起后这些进程信息都会丢失,但这种模式的性能最高(具体没测,看书上说),这种模式是ASP.NET的默认方式。
由于这种模式出现了故障,当时我的考虑就是由于访问量过大的原因,导致Inetinfo.exe进程崩溃。用户难以登陆以致Session丢值出现故障,我采用了另外一种Session的存储方式把Session信息存储在进程外。
首先,打开管理工具找到服务,找到名为:ASP.NET State Service的服务,启动它.并且改成自动启动。这时你可以在任务管理器中看到一个名为aspnet_state.exe的进程。这就是我们保存session信息的进程。
然后,回到web.config文件中把Mode的值改为StateServer,保存文件。OK.
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"
cookieless="false"
timeout="20"
/>
这种模式当我们重起IIS,保存的session值不会丢失。另外这种方式还可以把信息保存在其他机器的进程中,不过还要更改 stateConnectionString="tcpip=127.0.0.1:42424",IP地址改为其他机器即可。
另外还采取了其他的措施.比如把数据库和Web服务器分开,数据库服务器不提供WEB服务,Web服务器不提供数据库服务,
然后把连接池扩大,由于ASP.NET中ADO.NET数据访问默认连接池数量为100, 后来我扩大到6000顺便把写法加上来
“Server=(local);Database=rgs;password=sa;user ID=sa;Max Pool Size =6000; Min Pool Size =5;Pooling=True”
最后把Machine.config中的ProcessModel中的memoryLimit改为95,默认为60,表示内存占用超过60%后iis进程会自动重起。接着还做写其它一些优化IIS的方法,把注册表的IIS缓存加大等等 。
当我做完这些优化步骤后,整个软件运行比较良好,第二天没有发现堵塞的现象,但是第三天情况又出现了,实在没办法,我采取了最后一种方法就是将Session存储在SQLServer中,我想这样稳定性应该强些。
要
使用SQLServer中,首先在会话状态的SQLServer的计算机上,运行InstallSqlState.sql或
InstallPersistSqlState.sql(默认位置:systemroot/Microsoft.NET/Framework
/versionNumber下面)两个脚本都创建一个名为ASPState的数据库,两个脚本的差别在于放置
ASPStateTempApplication和ASPStageTempSessions表的位置。InstallSqlState.sql脚本将这
些表添加到TempDB数据库,该数据库在计算机重起时将丢失数据,而InstallPersistSqlState.sql脚本将这些表添加到
ASPState数据库,该数据库重启时保留会话数据。
然后在应用程序的web.config文件中,
把<sessionState>元素的mode属性设置为SQLServer,最后将sqlConnectionString属性设置为
Integrated Security=SSPI;data source=serverName;
<sessionState mode="SQLServer"
sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;"
cookieless="false"
timeout="20"/>
</sessionState>
如果部署在其他机器上可以更改为,加上用户名和密码
<sessionState
mode="SQLServer"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"
cookieless="false"
timeout="20"
/>
这
样部署完成了,如果不想使用这种可以删除掉,只要在相应的目录(systemroot/Microsoft.NET/Framework
/versionNumber)找到UninstallPersistSqlState.sql或者UninstallSqlState.sql文件运行
即可。
最后要注意的是,无论使用StateServer或者SQLServer模式时,当使用session转换对象时,注意对象要先序列化,就是在类前加上Serializable,否则会出现错误!
当最后这种模式应用后,系统稳定了一段时间 ,目前还没有异常出现,不过,随着软件用户群的增加,这些天还在准备进一步的优化措施。
转载自:http://www.cnblogs.com/mingfei200169/articles/514906.html
相关文章推荐
- Asp.net 中session存储的三种模式的具体运用(转)
- Asp.net 中session存储的三种模式的具体运用
- Asp.net 中session存储的三种模式的具体运用(转贴)
- Asp.net 中session存储的三种模式的具体运用
- .Net基础:ASP.NET中的session存储模式运用
- ASP.NET中的session存储模式运用
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
- WPF/Silverlight中的MVVM模式能否在WinForm/ASP.NET上运用?
- WPF/Silverlight中的MVVM模式能否在WinForm/ASP.NET上运用?
- 运用ASP.NET的输出缓冲来存储动态页面
- 基于.NET三种Ajax技术的运用——原生js、ASP.NET Ajax和.NET回调技术
- 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。
- Asp.net中把Excel数据存储至SQL Server中的具体实现方法
- Asp.net中把Excel数据存储至SQL Server中的具体实现方法
- ASP.NET中的session存储模式
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。”的问题
- WPF/Silverlight中的MVVM模式能否在WinForm/ASP.NET上运用?
- asp.net中三种临时存储
- WPF/Silverlight中的MVVM模式能否在WinForm/ASP.NET上运用?
- WPF/Silverlight中的MVVM模式能否在WinForm/ASP.NET上运用?