在我的.NET Web應用程序中,我將基本用戶信息保存在用戶會話對象中。我通常還會在會議中保留一個導演班;這基本上只是有關於它在屏幕上工作的任何信息(如客戶ID)的信息。管理會話變量的最佳方式是什麼?
我正在努力避免添加大量會話。我也想確保在任何給定的時間只有必要的會話在內存中。
這意味着我需要管理我的會話變量的有效途徑。有什麼建議麼?
在我的.NET Web應用程序中,我將基本用戶信息保存在用戶會話對象中。我通常還會在會議中保留一個導演班;這基本上只是有關於它在屏幕上工作的任何信息(如客戶ID)的信息。管理會話變量的最佳方式是什麼?
我正在努力避免添加大量會話。我也想確保在任何給定的時間只有必要的會話在內存中。
這意味着我需要管理我的會話變量的有效途徑。有什麼建議麼?
我通常所做的只是保持Session中的對象的id,並將數據保存在數據庫前面的緩存層中。這樣,您的會話保持相當小,但如果項目在緩存中,大多數數據仍可以有效地檢索。這對我來說通常效果很好。
兩件事情:
1 - 你不應該在會話中存儲這麼多,內存管理是一個問題。即,不要在會話中存儲對象,存儲指向事物的指針,而不是用戶的實例只存儲用戶ID。如果需要,可以添加信息檢索的緩存,但應該位於與會話分開的緩存層中。
2 - 使用數據庫會話,所以不存在有關服務器內存的關注,讓您可以根據需要輕鬆添加更多的Web服務器(注意,StateServer給你這個能力以及)。此外,這可以讓您重新使用應用程序池,而無需用戶丟失會話。這是我做這件事的主要原因 - 它可以讓我隨時部署。
治療會話這麼細究其原因,是他們流連用戶最近的請求後,一般爲10〜20分鐘。因此,如果在會話中存儲大型對象,來自多個不同會話的請求可能會佔用大量服務器內存。做更瘋狂的事情,比如在會話中存儲數據庫連接,可能會導致您使用所有可用的數據庫連接,這是因爲有太多內存在內存中等待會話過期。
理想的情況下,有沒有需要會話的「管理」。
+1好得多的建議,存儲輕量級數據,而不是實際的對象/數據集/表等。 – JonH 2010-03-25 17:17:43
我認爲你誤會ASP.NET中的會話。你沒有明確地管理它們(儘管你可以,你很少會想),它們是由ASP.NET和IIS隱式創建和銷燬的。每個用戶都有一個會話。
現在任何你存儲用戶會話內部存儲器中存儲的服務器上,所以如果你經常放置大型物體在每個用戶會話,這將導致內存快速增長導致的性能和可擴展性的問題。
你需要在會話存儲的唯一數據是要橫跨要確保它不是提供給一個cookie或類似的結構在客戶端不同的頁面請求提供瞬態數據。
但是讀你在做什麼這極有可能是沒有必要的。由於您正在使用特定頁面和「導演」功能,因此這很可能適合放置在視圖狀態的頁面上作爲中介數據存儲。
沒有賴特的答案。這取決於併發用戶的數量,取決於內存的大小。 如果您在proc中擁有會話變量,則保持會話上的內容比在數據庫上更快。 我通常會盡量只保留我知道用戶在特定任務期間可能需要的內容,或者像您說的那樣,保留當前用戶的信息。
我的建議是:
HTH你會對IPerSessionCache的壽命更好的控制。
歡迎來到SO。您可能需要添加編程語言特定標籤以吸引更多觀衆。另外,我並不完全瞭解您的問題,您是否在談論有很多用戶會話(爲什麼他們都會同時激活?)或您在會話中存儲的大量每用戶數據? – 2010-03-25 17:12:41