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

前端之家收集整理的这篇文章主要介绍了是否有必要创建ASP.NET 4.0 SQL会话状态数据库,与现有的ASP.NET 2.0 ASPState DB不同?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
ASP.NET 4.0 sql会话状态机制是否与会话状态的ASP.NET 2.0架构向后兼容,或者/我们应该/我们必须为我们的ASP.NET 4.0应用程序创建一个单独的和不同的会话状态数据库

我正在倾向于后者,但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存储过程:

  1. CREATE PROCEDURE dbo.DeleteExpiredSessions
  2. AS
  3. DECLARE @now datetime
  4. SET @now = GETUTCDATE()
  5.  
  6. DELETE [ASPState].dbo.ASPStateTempSessions
  7. WHERE Expires < @now
  8.  
  9. RETURN 0
  10. GO

.NET 4.0 ASPState DeleteExpiredSessions存储过程:

  1. CREATE PROCEDURE dbo.DeleteExpiredSessions
  2. AS
  3. SET NOCOUNT ON
  4. SET DEADLOCK_PRIORITY LOW
  5. DECLARE @now datetime
  6. SET @now = GETUTCDATE()
  7. CREATE TABLE #tblExpiredSessions
  8. (
  9. SessionID nvarchar(88) NOT NULL PRIMARY KEY
  10. )
  11. INSERT #tblExpiredSessions (SessionID)
  12. SELECT SessionID
  13. FROM [ASPState].dbo.ASPStateTempSessions WITH (READUNCOMMITTED)
  14. WHERE Expires < @now
  15. IF @@ROWCOUNT <> 0
  16. BEGIN
  17. DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY
  18. FOR SELECT SessionID FROM #tblExpiredSessions
  19. DECLARE @SessionID nvarchar(88)
  20. OPEN ExpiredSessionCursor
  21. FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
  22. WHILE @@FETCH_STATUS = 0
  23. BEGIN
  24. DELETE FROM [ASPState].dbo.ASPStateTempSessions WHERE
  25. SessionID = @SessionID AND Expires < @now
  26. FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
  27. END
  28. CLOSE ExpiredSessionCursor
  29. DEALLOCATE ExpiredSessionCursor
  30. END
  31. DROP TABLE #tblExpiredSessions
  32. RETURN 0
  33. GO

至于为什么上述变化是必要的,我发现以下MSDN博客文章

> Deadlock when storing Asp.net sessions in SQL server during peak load

摘录,参考较旧的程序:


This would take the locks on all
the expired records for deletion and
these locks may be promoted to page
locks. This can give rise to deadlocks
with other ‘session state write
statements’ when the number of records
marked for deletion increases. By
default this stored procedure is
supposed to run every minute.

因此,存储过程的较新版本也可能适用于ASP.NET 2.0应用程序.

我从博客中学到的另一件事我不知道:ASP.NET 4.0会话状态机制现在提供压缩.在sessionState Element (ASP.NET Settings Schema)搜索compressionEnabled.

最后,我还刚刚在ASP.NET Side-by-Side Execution Overview发现了一些与微软有关的内容.摘录:


If sql Server is used to manage
session state,all versions of ASP.NET
(of the .NET Framework) that are
installed on the same computer can
share the sql state server that is
installed with the latest version of
ASP.NET. The schema for session state
is the same in all versions of
ASP.NET.

(虽然在实现方面有一些不同于模式的特定区别.)

猜你在找的asp.Net相关文章