2012-01-10 4 views
4

SQLサーバーに格納されているASP.NETセッションを使い始めました。しかし、アプリケーションプール全体でセッションが最後になるので、新しいコードを配備すると、これが問題になる可能性があります。このモデルですべてのセッション(またはアプリケーションプールの少なくともすべてのセッション)を強制的に破棄する方法(SQLサーバーを再起動する方法以外)がありますか?SQL Serverに格納されたASP.NETセッションをどのようにリサイクルできますか?

答えて

7

のASPStateデータベース内のストアドプロシージャとしてこれを追加します。

 CREATE PROCEDURE [dbo].[DeleteExpiredSessions] 
    AS 
     DECLARE @now datetime 
     SET @now = GETUTCDATE() 

     DELETE [ASPState].dbo.ASPStateTempSessions 
     WHERE Expires < @now 

     RETURN 0 

は、その後、一定の間隔で実行されるSQL Serverエージェントにジョブを追加(鉱山が深夜に実行されます)その上で、次のステップを実行していますデータベース:

dbo.DeleteExpiredSessions 

セッションが期限切れになるとき、彼らはそれらを作成したプロセスが周りにいない場合でも、離れて行くを確認します。

DELETE [ASPState].dbo.ASPStatsTempSessions 

これで、データベース内のすべてのセッションが削除されます。これにより、プロセスの再起動時にすべてを取り除くことができます。

+0

**?削除されたセッション?** _ASPStateデータベースのロックと拡張に関する問題_ http://dba.stackexchange.com/questions/30445/aspstate-database-locking-and-growth-problems – Kiquenet

6

@RobertBeaubienは、これを処理するDeleteExpiredSessionsプロシージャを記述しています。この手順は、セッションストアデータベースの作成時に、aspnet_regsqlツールを使用してデータベースにすでに作成されている必要があります。 60秒ごとにSQLエージェントジョブを呼び出す必要があります。これは誤って無効にされている可能性があります。手順の説明については

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 

See here

手順のASP.NET 4.0のバージョンは、次のようになります。

関連するストアドプロシージャと、SQL Serverセッション状態プロバイダの背後にある方法については、this MSDN articleで説明しています。

1

パフォーマンス上の理由から、可能であれば、カーソルから離しておくことをお勧めします。 私の代わりにマージ使用DeleteExpiredSessionsストアドプロシージャを書き直し:SQL ServerののASPStateで最高のパターンとプラクティスです

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 (NOLOCK) 
     WHERE Expires < @now 

    MERGE dbo.ASPStateTempSessions AS [target] 
    USING #tblExpiredSessions AS [source] 

    ON ([target].[SessionID] = [source].[SessionID] AND Expires < @now) 

    WHEN MATCHED 
     THEN DELETE; 

    DROP TABLE #tblExpiredSessions 
RETURN 0  
GO 
+0

** SQL ServerのASPState?セッションを削除しましたか?** _ASPStateデータベースのロックと拡張の問題_ http://dba.stackexchange.com/questions/30445/aspstate-database-locking-and-growth-problems – Kiquenet

関連する問題