是否需要创建ASP.NET 4.0 SQL会话状态数据库,与现有ASP.NET 2.0 ASPState DB不同?
ASP.NET 4.0SQL会话状态机制是否与会话状态的ASP.NET 2.0模式向后兼容,或者我们是否应该/必须为我们的ASP.NET 4.0应用程序创建一个单独且不同的会话状态数据库是否需要创建ASP.NET 4.0 SQL会话状态数据库,与现有ASP.NET 2.0 ASPState DB不同?,asp.net,sql-server,.net-4.0,session-state,asp.net-4.0,Asp.net,Sql Server,.net 4.0,Session State,Asp.net 4.0,ASP.NET 4.0SQL会话状态机制是否与会话状态的ASP.NET 2.0模式向后兼容,或者我们是否应该/必须为我们的ASP.NET 4.0应用程序创建一个单独且不同的会话状态数据库 无论如何,我倾向于后者,但是2.0数据库似乎可以正常工作,尽管我想知道ASP.NET的2.0和4.0版本之间的ASPState数据库模式/过程是否有实质性的区别。谢谢。没有任何人能快速回答这个问题,所以我做了一些挖掘。我使用.NET 2.0中的aspnet_regsql.exe工具生成了一个ASPState数据
无论如何,我倾向于后者,但是2.0数据库似乎可以正常工作,尽管我想知道ASP.NET的2.0和4.0版本之间的ASPState数据库模式/过程是否有实质性的区别。谢谢。没有任何人能快速回答这个问题,所以我做了一些挖掘。我使用.NET 2.0中的
aspnet_regsql.exe
工具生成了一个ASPState
数据库,然后我使用相同的工具,但从.NET 4.0中执行了相同的操作。然后,我从每个生成的SQL Server数据库生成脚本,并使用比较工具来隔离差异
我发现:从.NET 2.0到.NET 4.0版本的ASPState
模式之间唯一的实质性区别是dbo.DeleteExpiredSessions
存储过程。这是该工具安装的SQL Server代理计划作业定期调用的存储过程
因此,ASPState 2.0和ASPState 4.0的模式似乎是完全兼容的,因此从技术角度来看,没有必要将ASP.NET 2.0和ASP.NET 4.0会话状态分开,但我可能还是会这样做
(这一发现有点令人惊讶,因为ASPState从.NET 1.1到.NET 2.0发生了很大变化。)
每个版本的已更改存储过程的详细信息:
.NET 2.0 ASPState DeleteExpiredSessions存储过程:
创建过程dbo.DeleteExpiredSessions
作为
声明@now datetime
SET@now=GETUTCDATE()
删除[ASPState].dbo.ASPStateTempSessions
现在在哪里
返回0
去
.NET 4.0 ASPState DeleteExpiredSessions存储过程:
创建过程dbo.DeleteExpiredSessions
作为
不计较
将死锁设置为低优先级
声明@now datetime
SET@now=GETUTCDATE()
创建表#tblExpiredSessions
(
SessionID nvarchar(88)主键不为空
)
插入#tblExpiredSessions(SessionID)
选择SessionID
来自[ASPState].dbo.ASPStateTempSessions与(READUNCOMMITTED)
现在在哪里
如果@@ROWCOUNT 0
开始
声明ExpiredSessionCursor游标本地转发只读
对于从#tblExpiredSessions中选择SessionID
声明@SessionID nvarchar(88)
打开过期的sessioncursor
从ExpiredSessionCursor获取下一个到@SessionID
而@@FETCH\u STATUS=0
开始
从[ASPState].dbo.ASPStateTempSessions中删除,其中
SessionID=@SessionID和Expires<@现在
从ExpiredSessionCursor获取下一个到@SessionID
结束
关闭过期的sessioncursor
取消分配过期的SessionCursor
结束
DROP TABLE#tblExpiredSessions
返回0
去
至于为什么需要进行上述更改,我发现了以下MSDN博客帖子:
这会把所有的锁都锁上 已过期的记录将被删除和删除 这些锁可以升级到第页 锁。这可能会导致死锁 使用其他“会话状态写入” 语句“当记录数 标记为删除增加。通过 默认情况下,此存储过程为 应该每分钟跑一次。 因此,ASP.NET 2.0应用程序也建议使用较新版本的存储过程 从博客文章中我还学到了一件我不知道的事情:ASP.NET 4.0会话状态机制现在提供了压缩功能。搜索
compressionEnabled
at
最后,我还从微软网站上找到了一些相关信息。摘录: …
如果使用SQL Server来管理 会话状态,ASP.NET的所有版本 (指.NET Framework)是 安装在同一台计算机上可以 共享正在运行的SQL state server 已安装最新版本的 ASP.NET会话状态的模式 在的所有版本中都是相同的 ASP.NET。
(虽然在实现上存在一些不同,但并不特定于模式。)感谢您发布您的答案!它帮助我们找到了解决办法。对于任何其他有此问题的人,这里是m$KB:
CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
DECLARE @now datetime
SET @now = GETUTCDATE()
DELETE [ASPState].dbo.ASPStateTempSessions
WHERE Expires < @now
RETURN 0
GO
CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
SET NOCOUNT ON
SET DEADLOCK_PRIORITY LOW
DECLARE @now datetime
SET @now = GETUTCDATE()
CREATE TABLE #tblExpiredSessions
(
SessionID nvarchar(88) NOT NULL PRIMARY KEY
)
INSERT #tblExpiredSessions (SessionID)
SELECT SessionID
FROM [ASPState].dbo.ASPStateTempSessions WITH (READUNCOMMITTED)
WHERE Expires < @now
IF @@ROWCOUNT <> 0
BEGIN
DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY
FOR SELECT SessionID FROM #tblExpiredSessions
DECLARE @SessionID nvarchar(88)
OPEN ExpiredSessionCursor
FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM [ASPState].dbo.ASPStateTempSessions WHERE
SessionID = @SessionID AND Expires < @now
FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
END
CLOSE ExpiredSessionCursor
DEALLOCATE ExpiredSessionCursor
END
DROP TABLE #tblExpiredSessions
RETURN 0
GO