• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

关于Asp.Net的SessionState

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

前因:近日在一项目中数据库服务器CPU频繁发生负荷几乎达到100%崩溃状态,检查发现很多对AspState会话状态库进程阻塞情况,通过排查发现tempdb..ASPStateTempSessions的扫描碎片比率很大,故怀疑此引发问题的,为保守起见,没有重新执行脚本InstallSqlState.sql,而是执行dbcc dbreindex对tempdb..ASPStateTempSessions表进行索引重建,经过在线高峰监测,数据库服务器CPU负荷大幅下降,运作正常,问题解决!

虽然问题解决了,但还是留下很多需要是深入了解探究的知识。

重建索引前

表: 'ASPStateTempSessions'1977058079);索引 ID: 1,数据库 ID: 2
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 3025
- 扫描扩展盘区数...............................: 384
- 扩展盘区开关数...............................: 2970
- 每个扩展盘区上的平均页数.....................: 7.9
- 扫描密度[最佳值:实际值]....................: 12.76%379:2971
- 逻辑扫描碎片.................................: 50.38%
- 扩展盘区扫描碎片.............................: 95.31%
- 每页上的平均可用字节数.......................: 4035.8
- 平均页密度(完整)...........................: 50.14%

重建索引后

表: 'ASPStateTempSessions'1977058079);索引 ID: 1,数据库 ID: 2
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 1744
- 扫描扩展盘区数...............................: 220
- 扩展盘区开关数...............................: 219
- 每个扩展盘区上的平均页数.....................: 7.9
- 扫描密度[最佳值:实际值]....................: 99.09%218:220
- 逻辑扫描碎片.................................: 0.00%
- 扩展盘区扫描碎片.............................: 6.36%
- 每页上的平均可用字节数.......................: 1050.9
- 平均页密度(完整)...........................: 87.02%

扫描密度大幅提高,碎片下降!


下面简单整理一下关于会话状态的相关知识。

参考微软MSDN文章:http://msdn.microsoft.com/en-us/library/ms178586(v=VS.85).aspx

  • 会话状态的存储模式

1、In-process Mode 默认进程模式

<sessionState mode="Inproc" cookieless="false" timeout="20"/> </sessionState>

2、State Server Mode

<sessionState mode="StateServer" stateConnectionString="tcpip=dataserver:42424" cookieless="false" timeout="20"/> </sessionState> 

3、SQL Server Mode

<sessionState mode="SQLServer" sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;" cookieless="false" timeout="20"/> </sessionState> 

语法:

<sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" stateNetworkTimeout="number of seconds" /> 

mode 设置将Session信息存储到哪里?

Off 设置为不使用Session功能

InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。

StateServer 设置为将Session存储在独立的状态服务中。 <驱动器>:\systemroot\Microsoft.NET\Framework\version\aspnet_state.exe

SQLServer 设置将Session存储在SQL Server中。 <驱动器>:\systemroot\Microsoft.NET\Framework\version\InstallSqlState.sql

可选的属性是:

属性 选项 描述

cookieless 设置客户端的Session信息存储到哪里 ture 使用Cookieless模式 false 使用Cookie模式,这是默认值。

timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟

stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。

sqlConnectionString 设置与SQL Server连接时的连接字符串。

例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。

stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。

  • Installing the Session State Database Using the Aspnet_regsql.exe Tool

systemroot\Microsoft.NET\Framework\versionNumber\InstallSqlState.sql

如:aspnet_regsql.exe -S 数据库实例名 -E -ssadd -sstype p

 

  • ASP.NET 状态数据库FAQ
    1.如果把SESSION值存放到数据库中去,用户关闭了程序那怎么样清空数据库里的SESSION值呢?
    实际ASP.NET在创建状态数据库的时候会在SQL Server代理(SQL Server Agent)的作业中添加一个作业,名称为<状态数据库名>_Job_DeleteExpiredSessions。如果打开SQL Server代理服务数据库可以通过添加的状态记录的超时时间字段(Exprires)定期对超时的状态数据进行删除。
    2.ASPStateTempSessions表中的SessionId字段如何使用?
    数据库中此表的SessionID字段的值,由SessionID和AppID共同组成,最后8位为AppID所以,后8位之前一定是SessionID。例如,存储在数据库中的值为"ekr30c3mwvnc3145yrswew3a037e5e5a",后8位的"037e5e5a"为AppID,而前面的"ekr30c3mwvnc3145yrswew3a"为应用程序中你可以使用Session.SessionID获得的字符串。
    3.如何判断Session何时被更新的?
    Session记录被更新时会同时更新Expires和LockDateLocal,Expires字段为UTC时间,如果想通过本地之间进行比较判断还是需要使用LockDateLocal。
    4.获得Web.config配置文件节点信息的程序?

安装

打开VS命令提示,输入:aspnet_regsql.exe –?  

aspnet_regsql.exe的说明,有一命令:-ssadd(Session state add?) 意为:添加对 sqlserver 模式会话状态的支持.

输入如下:

aspnet_regsql.exe -ssadd –E 或 指定用户名:aspnet_regsql.exe -ssadd -U sa

删除该功能则执行aspnet_regsql.exe -s-s-remove –E

 

 

参考资料:

http://www.cnblogs.com/leonsky/articles/1427014.html

http://msdn.microsoft.com/en-us/library/ms178586(v=VS.85).aspx

http://space.itpub.net/16436858/viewspace-551828

将Session值储存于SQL Server中.


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.net动态加载checkbox的全选/全不选发布时间:2022-07-10
下一篇:
使用asp.net中的跟踪功能发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap