2017-10-18 99 views
0

我有一個版本的DeleteExpiredSessions(由Microsooft提供),它使用Cursor並將數據存儲到臨時表中。 You can find it hereASP.NET會話管理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 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() 
+0

爲什麼這太寬泛了,應該有一些理由他們用這種方式來實現或者它是錯誤的。 – FLICKER

回答

1

通過代碼和思維展望關於潛在的數據庫負載和數據量,我認爲這樣做的原因是保持清理腳本不會導致可能升級並干擾應用程序的鎖定。會話表將在每個Web請求的關鍵路徑上。

+0

有道理。我忽略了行數可能很大,並且可能導致表鎖定。如果我沒有得到更好的答案,我會接受你的答案。謝謝! – FLICKER