2017-10-18 3 views
0

J'ai une version de DeleteExpiredSessions (fournie par Microsooft) qui utilise Cursor et stocke des données dans des tables temporaires. You can find it hereGestion de session ASP.NET DeleteExpiredSessions Vous semble idiot?

Et voici le code source de procédure stockée

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                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

Je me demande pourquoi il ne supprime pas simplement sessions expirées en utilisant ci-dessous requête:

DELETE [ASPState].dbo.ASPStateTempSessions 
WHERE Expires < GETUTCDATE() 
+0

pourquoi est-ce trop large?, Il devrait y avoir une raison pour laquelle ils ont mis en œuvre de cette façon ou il est faux. – FLICKER

Répondre

1

En regardant à travers le code et la pensée A propos de la charge DB et du volume de données, je pense que la raison en est que le script de nettoyage ne doit pas provoquer de verrous qui pourraient dégénérer et interférer avec l'application. La table de session serait sur le chemin critique pour chaque requête Web.

+0

C'est logique. J'ai oublié que le nombre de lignes peut être énorme et cela peut provoquer un blocage de la table. J'accepterai votre réponse si je n'en ai pas obtenu une meilleure. Je vous remercie! – FLICKER