ปรับปรุง DeleteExpiredSessions กระบวนงานที่เก็บไว้ใน ASP.NET 2.0


บทนำ


ถ้าทั้งจำนวนของเซสชันและขนาดของแต่ละเซสชันเพิ่มใน Microsoft ASP.NET 2.0 การลบเซสชันที่หมดอายุอาจส่งผลกระทบต่อประสิทธิภาพโดยรวมของ ASP.NET เว็บไซต์ เมื่อดำเนินการงานการลบ การบล็อคใด ๆ ที่เกิดขึ้นบนเซิร์ฟเวอร์ที่กำลังเรียกใช้ Microsoft SQL Server จะส่งผลกระทบในการดำเนินการการร้องขอ ASP.NET ที่ใช้โหมดเซสชัน SQL Server

การปรับปรุงล่าสุดไปยังกระบวนงานเก็บไว้DeleteExpiredSessionsช่วยเพิ่มประสิทธิภาพ และลดการบล็อค การปรับปรุงนี้ย่อหน้าผลเสียต่อบนการดำเนินการของ ASP.NET การร้องขอ การปรับปรุงนี้จะยังนำมาใช้ในรุ่นถัดไปของ ASP.NET

ข้อมูลเพิ่มเติม


เมื่อต้องการใช้DeleteExpiredSessionsใหม่ที่กระบวนงานที่เก็บไว้ไว้ ให้ทำตามขั้นตอนเหล่านี้:


  1. เปิดคอนโซล Studio จัดการของเซิร์ฟเวอร์ SQL
  2. คลิกสร้างแบบสอบถาม
  3. ถ้าคุณใช้สถานะเซสชัน SQL ที่ไม่ใช่แบบถาวร วางสคริปต์ต่อไปนี้ลงในบานหน้าต่างด้านขวา
    USE [ASPState]GO

    DECLARE @ver int
    EXEC dbo.GetMajorVersion @@ver=@ver OUTPUT
    DECLARE @cmd nchar(4000)
    IF (@ver >= 8)
    SET @cmd = N'
    ALTER 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 [tempdb].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 [tempdb].dbo.ASPStateTempSessions WHERE SessionId = @SessionId
    FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId
    END

    CLOSE ExpiredSessionCursor

    DEALLOCATE ExpiredSessionCursor

    END

    DROP TABLE #tblExpiredSessions

    RETURN 0'
    ELSE
    SET @cmd = N'
    ALTER PROCEDURE dbo.DeleteExpiredSessions
    AS
    SET NOCOUNT ON
    SET DEADLOCK_PRIORITY LOW

    DECLARE @now datetime
    SET @now = GETDATE()

    CREATE TABLE #tblExpiredSessions
    (
    SessionId nvarchar(88) NOT NULL PRIMARY KEY
    )

    INSERT #tblExpiredSessions (SessionId)
    SELECT SessionId
    FROM [tempdb].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 [tempdb].dbo.ASPStateTempSessions WHERE SessionId = @SessionId
    FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId
    END

    CLOSE ExpiredSessionCursor

    DEALLOCATE ExpiredSessionCursor

    END

    DROP TABLE #tblExpiredSessions

    RETURN 0'
    EXEC (@cmd)
    GO
    ถ้าคุณใช้สถานะเซสชัน SQL ปรากฏอย่างสม่ำเสมอ วางสคริปต์ต่อไปนี้ลงในบานหน้าต่างด้านขวา
    USE [ASPState]GO

    DECLARE @ver int
    EXEC dbo.GetMajorVersion @@ver=@ver OUTPUT
    DECLARE @cmd nchar(4000)
    IF (@ver >= 8)
    SET @cmd = N'
    ALTER 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
    FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId
    END

    CLOSE ExpiredSessionCursor

    DEALLOCATE ExpiredSessionCursor

    END

    DROP TABLE #tblExpiredSessions

    RETURN 0'
    ELSE
    SET @cmd = N'
    ALTER PROCEDURE dbo.DeleteExpiredSessions
    AS
    SET NOCOUNT ON
    SET DEADLOCK_PRIORITY LOW

    DECLARE @now datetime
    SET @now = GETDATE()

    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
    FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId
    END

    CLOSE ExpiredSessionCursor

    DEALLOCATE ExpiredSessionCursor

    END

    DROP TABLE #tblExpiredSessions

    RETURN 0'
    EXEC (@cmd)
    GO
  4. คลิกดำเนินการ
เมื่อต้องการตรวจสอบถ้าฐานข้อมูลสถานะเซสชันถูกกำหนดค่าให้เป็นสถานะเซสชัน SQL อย่างสม่ำเสมอ หรือที่ไม่ใช่แบบถาวร ใช้ข้อกำหนดต่อไปนี้:
  • สถานะเซสชัน SQL ที่ไม่ใช่แบบถาวร
    ตาราง ASPStateTempApplications และ ASPStateTempSessions จะถูกสร้างขึ้นในฐานข้อมูล tempdb เพื่อเก็บข้อมูลเซสชัน
  • สถานะเซสชัน SQL อย่างสม่ำเสมอ
    ตาราง ASPStateTempApplications และ ASPStateTempSessions จะถูกสร้างขึ้นในฐานข้อมูลเดียวกันเป็นฐานข้อมูลสถานะเซสชันการจัดเก็บข้อมูลเซสชัน