是否有必要创建与现有 ASP.NET 2.0 ASPState DB 不同的 ASP.NET 4.0 SQL 会话状态数据库?

2024-04-18

Is the ASP.NET 4.0SQL 会话状态机制向后兼容 ASP.NET 2.0 会话状态架构,或者我们应该/必须为 ASP.NET 4.0 应用程序创建一个单独且不同的会话状态数据库?

无论如何我倾向于后者,但是2.0数据库seems正常工作,尽管我想知道 ASP.NET 2.0 和 4.0 版本之间的 ASPState 数据库架构/过程之间是否存在任何实质性差异。谢谢。


任何人都没有对此做出快速回答,所以我做了一些挖掘。我生成了一个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。

(尽管在实现上存在一些差异,但不特定于模式。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否有必要创建与现有 ASP.NET 2.0 ASPState DB 不同的 ASP.NET 4.0 SQL 会话状态数据库? 的相关文章

随机推荐