任何人都没有对此做出快速回答,所以我做了一些挖掘。我生成了一个ASPState
数据库使用aspnet_regsql.exe
.NET 2.0 中的工具,然后我使用 .NET 4.0 中的相同工具做了同样的事情。然后,我从每个生成的 SQL Server 数据库生成脚本,并使用比较工具来隔离差异。
我发现的是:两者之间唯一的实质性区别ASPState
从 .NET 2.0 到 .NET 4.0 版本的架构是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 存储过程:
CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
DECLARE @now datetime
SET @now = GETUTCDATE()
DELETE [ASPState].dbo.ASPStateTempSessions
WHERE Expires < @now
RETURN 0
GO
.NET 4.0 ASPState DeleteExpiredSessions 存储过程:
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
至于为什么需要进行上述更改,我找到了以下MSDN博文:
- 在峰值负载期间将 Asp.net 会话存储在 SQL Server 中时出现死锁 https://learn.microsoft.com/en-us/archive/blogs/webtopics/deadlock-when-storing-asp-net-sessions-in-sql-server-during-peak-load
摘录,参考旧程序:
...
这将锁定所有
需要删除的过期记录
这些锁可能会提升到页面
锁。这可能会导致死锁
与其他“会话状态写入”
语句’当记录数
标记为删除增加。经过
默认这个存储过程是
应该每分钟都跑。
...
因此,较新版本的存储过程可能也适用于 ASP.NET 2.0 应用程序。
我从博客文章中了解到我不知道的另一件事:ASP.NET 4.0 会话状态机制现在提供压缩。搜索于compressionEnabled
at sessionState 元素(ASP.NET 设置架构) https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/h6bb9cz9(v=vs.100).
最后,我还发现了一些来自微软的相关内容,位于ASP.NET 并行执行概述 https://learn.microsoft.com/en-us/previous-versions/a99txfy5(v=vs.140)。摘抄:
...
如果使用SQL Server来管理
会话状态,所有版本的 ASP.NET
(.NET Framework 的)
安装在同一台电脑上即可
共享 SQL 状态服务器
安装了最新版本的
ASP.NET。会话状态的架构
在所有版本中都是相同的
ASP.NET。
(尽管在实现上存在一些差异,但不特定于模式。)