是否有必要創建不同於現有 ASP.NET 2.0 ASPState DB 的 ASP.NET 4.0 SQL 會話狀態數據庫?
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 會話狀態機制現在提供了壓縮。
compressionEnabled在sessionState 元素(ASP.NET 設置架構)上搜尋。最後,我還剛剛在ASP.NET Side-by-Side Execution Overview中從 Microsoft 找到了一些相關的內容。摘抄:
…
如果使用 SQL Server 管理會話狀態,則安裝在同一台電腦上的所有版本的 ASP.NET(.NET Framework)可以共享安裝了最新版本的 ASP.NET 的 SQL 狀態伺服器. 會話狀態的架構在所有版本的 ASP.NET 中都是相同的。
(雖然在實現上存在一些不特定於模式的差異。)