使用SQL Server存储ASP.NET Session变量

来源:互联网 发布:手机网络关卡游戏 编辑:程序博客网 时间:2024/04/29 17:03

1. 安装Session数据库
在Framework目录
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727
运行下面的命令:
aspnet_regsql.exe -ssadd -sstype c -d [DB] -S [Server] –E
-E是使用Windows认证,也可以使用数据库认证:
aspnet_regsql.exe -ssadd -sstype c -d [DB] -S [Server] –U [User Name] – P [Password]

在指定的SQL Server服务器的指定数据库中建立Session数据库,可以是个单独的数据库,也就是可以是程序所用的数据库,也可以不给名字,那么会使用一个默认的数据库名称。创建完成后,在Sql Server里给上相应的帐号权限。

2. 修改web.config:
<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="data source=[Server];initial catalog=[DB];user id=[User Name];password=[Password]"
                cookieless="false"
                timeout="20" />
如果使用默认的数据库名称,如下:
<sessionState mode="SQLServer" sqlConnectionString="data source=[Server];user id=[User Name];password=[Password]"
                cookieless="false"
                timeout="20" />
这样程序的Session就会存储到数据库中了,需要注意的是,这样配置以后,存到Session中的对象必须是可序列化的,如果是自定义的类,那么就要加上[Seriablizable]属性。

3.注意在进行系统测试(主要是负载测试)的时候,因为数据库访问负载的增加,需要调整SQL Server相应超时的配置项以适应负载。(默认值为10,请适度进行调整。)

ASP.NET Session状态数据库数据模型
1.ASPStateTempSessions表定义

列名类型描述SessionIdnvarchar(88)Session ID + application IDCreateddatetimeDate and time session was created (UTC)ExpiresdatetimeDate and time session expires (UTC)LockDatedatetimeUTC date and time session was lockedLockDateLocaldatetimeLocal date and time session was lockedLockCookieintLock IDTimeoutintSession timeout in minutesLockedbit1=Session locked, 0=Session not lockedSessionItemShortvarbinary(7000)Serialized session state (if <= 7,000 bytes)SessionItemLongimageSerialized session state (if > 7,000 bytes)FlagsintSession state flags (1=Uninitialized session)
2.ASPStateTempApplications表定义
列名类型描述AppIdintApplication IDAppNamechar(280)Application name

 


3.使用的存储过程
Stored ProcedureDescriptionCreateTempTablesCreates the ASPStateTempSessions and ASPStateTempApplications tables; called during setup, but not called by SqlSessionStateStore.DeleteExpiredSessionsUsed by SQL Server Agent to remove expired sessions.GetHashCodeHashes an application name and returns the hash; called by TempGetAppID.GetMajorVersionReturns SQL Server's major version number.TempGetAppIDConverts an application name into an application ID; queries the ASPStateTempApplications table and inserts a new record if necessary.TempGetStateItemRetrieves read-only session state from the database (ASP.NET 1.0; ASP.NET 1.1/SQL Server 7).TempGetStateItem2Retrieves read-only session state from the database (ASP.NET 1.1).TempGetStateItem3Retrieves read-only session state from the database (ASP.NET 2.0).TempGetStateItemExclusiveRetrieves read/write session state from the database (ASP.NET 1.0; ASP.NET 1.1/SQL Server 7).TempGetStateItemExclusive2Retrieves read/write session state from the database (ASP.NET 1.1).TempGetStateItemExclusive3Retrieves read/write session state from the database (ASP.NET 2.0).TempGetVersionMarker whose presence indicates to ASP.NET 2.0 that the session state database is ASP.NET 2.0-compatible.TempInsertStateItemLongAdds a new session, whose size is > 7,000 bytes, to the database.TempInsertStateItemShortAdds a new session, whose size is <= 7,000 bytes, to the database.TempInsertUninitializedItemAdds a new uninitialized session to the database in support of cookieless sessions.TempReleaseStateItemExclusiveReleases a lock on a session; called when ASP.NET determines that a request has timed out and calls the provider's ReleaseItemExclusive method.TempRemoveStateItemRemoves a session from the database when the session is abandoned.TempResetTimeoutResets a session's timeout by writing the current date and time to the corresponding record's Expires field.TempUpdateStateItemLongUpdates a session whose size is > 7,000 bytes.TempUpdateStateItemLongNullShortUpdates a session whose old size is <= 7,000 bytes, but whose new size is > 7,000 bytes.TempUpdateStateItemShortUpdates a session whose size is <= 7,000 bytes.TempUpdateStateItemShortNullLongUpdates a session whose old size is > 7,000 bytes, but whose new size is <= 7,000 bytes.
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配置文件节点信息的程序?


''获得Web.config文件配置实例
Dim configuration As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config")

''获得状态配置节点实例
Dim mSessionStateSection As System.Web.Configuration.SessionStateSection = CType(configuration.GetSection("system.web/sessionState"),System.Web.Configuration.SessionStateSection)

''获得状态模式
Response.Write(mSessionStateSection.Mode)
''获得状态超时时间
Response.Write(mSessionStateSection.Timeout)

原创粉丝点击