Chr*_*Rea 16 sql-server asp.net session-state .net-4.0 asp.net-4.0
ASP.NET 4.0 SQL会话状态机制是否与会话状态的ASP.NET 2.0架构向后兼容,还是应该/我们必须为ASP.NET 4.0应用程序创建一个单独且不同的会话状态数据库?
无论如何我倾向于后者,但2.0数据库似乎只是工作,但我想知道在2.0和4.0版本的ASP.NET之间ASPState数据库模式/过程之间是否存在任何实质性差异.谢谢.
Chr*_*Rea 24
任何人都没有快速回答,所以我做了一些挖掘.我ASPState使用aspnet_regsql.exe.NET 2.0中的工具生成了一个数据库,然后我使用相同的工具但是从.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.)
每个版本的更改存储过程的详细信息:
CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
DECLARE @now datetime
SET @now = GETUTCDATE()
DELETE [ASPState].dbo.ASPStateTempSessions
WHERE Expires < @now
RETURN 0
GO
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
至于为何需要进行上述更改,我发现以下MSDN博客帖子:
摘录,参考旧程序:
...
这将删除所有过期记录上的锁定,并且这些锁定可以提升为页面锁定.当标记为删除的记录数增加时,这会导致与其他"会话状态写入语句"发生死锁.默认情况下,此存储过程应该每分钟运行一次. ...
因此,对于ASP.NET 2.0应用程序,也可以建议使用较新版本的存储过程.
我从博客文章中了解到的另一件事我不知道:ASP.NET 4.0会话状态机制现在提供压缩.compressionEnabled在sessionState元素上搜索(ASP.NET设置架构).
最后,我还在ASP.NET并排执行概述中找到了与Microsoft相关的内容.摘抄:
...
如果使用SQL Server来管理会话状态,则安装在同一台计算机上的所有ASP.NET(.NET Framework)版本都可以共享使用最新版本的ASP.NET安装的SQL状态服务器.会话状态的模式在所有ASP.NET版本中都是相同的.
(尽管在实现方面存在一些不同于模式的差异.)
| 归档时间: |
|
| 查看次数: |
8354 次 |
| 最近记录: |