ASP.NET 会话管理 DeleteExpiredSessions 看起来很傻?
ASP.NET Session Management DeleteExpiredSessions Looks silly?
我有一个使用 Cursor 并将数据存储到临时表中的 DeleteExpiredSessions 版本(由 Microsoft 提供)。 You can find it here
这是存储过程的源代码
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 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 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
我想知道为什么它不使用以下查询简单地删除过期会话:
DELETE [ASPState].dbo.ASPStateTempSessions
WHERE Expires < GETUTCDATE()
查看代码并考虑潜在的数据库负载和数据量,我认为这样做的原因是为了防止清理脚本导致可能升级和干扰应用程序的锁。会话 table 将位于每个 Web 请求的关键路径上。
我有一个使用 Cursor 并将数据存储到临时表中的 DeleteExpiredSessions 版本(由 Microsoft 提供)。 You can find it here
这是存储过程的源代码
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 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 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
我想知道为什么它不使用以下查询简单地删除过期会话:
DELETE [ASPState].dbo.ASPStateTempSessions
WHERE Expires < GETUTCDATE()
查看代码并考虑潜在的数据库负载和数据量,我认为这样做的原因是为了防止清理脚本导致可能升级和干扰应用程序的锁。会话 table 将位于每个 Web 请求的关键路径上。