Asp.net

是否有必要創建不同於現有 ASP.NET 2.0 ASPState DB 的 ASP.NET 4.0 SQL 會話狀態數據庫?

  • March 4, 2021

ASP.NET 4.0 SQL 會話狀態機制是否向後兼容用於會話狀態的 ASP.NET 2.0 架構,或者我們應該/必須為我們的 ASP.NET 4.0 應用程序創建一個單獨且不同的會話狀態數據庫?

無論如何,我傾向於後者,但 2.0 數據庫似乎可以正常工作,儘管我想知道 2.0 和 4.0 版本的 ASP.NET 之間的 ASPState 數據庫架構/過程之間是否存在任何實質性差異。謝謝你。

任何人都沒有快速回答這個問題,所以我做了一些探勘。我使用來自 .NET 2.0 的工俱生成了一個ASPState數據庫aspnet_regsql.exe,然後我使用相同的工具但來自 .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 發生了很大變化。)

每個版本的更改儲存過程的詳細資訊:

.NET 2.0 ASPState DeleteExpiredSessions 儲存過程:

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

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

   RETURN 0   
GO

.NET 4.0 ASPState 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 [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

至於為什麼需要進行上述更改,我找到了以下 MSDN 部落格文章:

摘錄,參考舊程序:

這將對所有過期記錄進行鎖定以進行刪除,並且這些鎖定可能會升級為頁面鎖定。當標記為刪除的記錄數量增加時,這可能會導致與其他“會話狀態寫入語句”的死鎖。預設情況下,這個儲存過程應該每分鐘執行一次。

因此,對於 ASP.NET 2.0 應用程序,更新版本的儲存過程也可能是可取的。

我從博文中學到的另一件事是我不知道的:ASP.NET 4.0 會話狀態機制現在提供了壓縮compressionEnabledsessionState 元素(ASP.NET 設置架構)上搜尋。


最後,我還剛剛在ASP.NET Side-by-Side Execution Overview中從 Microsoft 找到了一些相關的內容。摘抄:

如果使用 SQL Server 管理會話狀態,則安裝在同一台電腦上的所有版本的 ASP.NET(.NET Framework)可以共享安裝了最新版本的 ASP.NET 的 SQL 狀態伺服器. 會話狀態的架構在所有版本的 ASP.NET 中都是相同的。

(雖然在實現上存在一些不特定於模式的差異。)

引用自:https://stackoverflow.com/questions/2922263