2010-03-25 96 views
1

在我的.NET Web應用程序中,我將基本用戶信息保存在用戶會話對象中。我通常還會在會議中保留一個導演班;這基本上只是有關於它在屏幕上工作的任何信息(如客戶ID)的信息。管理會話變量的最佳方式是什麼?

我正在努力避免添加大量會話。我也想確保在任何給定的時間只有必要的會話在內存中。

這意味着我需要管理我的會話變量的有效途徑。有什麼建議麼?

+1

歡迎來到SO。您可能需要添加編程語言特定標籤以吸引更多觀衆。另外,我並不完全瞭解您的問題,您是否在談論有很多用戶會話(爲什麼他們都會同時激活?)或您在會話中存儲的大量每用戶數據? – 2010-03-25 17:12:41

回答

0

我通常所做的只是保持Session中的對象的id,並將數據保存在數據庫前面的緩存層中。這樣,您的會話保持相當小,但如果項目在緩存中,大多數數據仍可以有效地檢索。這對我來說通常效果很好。

-4

我的建議:不要使用會話變量。將所有內容存儲在數據庫中

+0

-1 - 您不希望將臨時信息(如會話信息)存儲在數據庫中。 – JonH 2010-03-25 17:15:37

+2

這不是一個/或選擇。你可以將會話持久化到數據庫,這實際上是我的首選方法。 – RedFilter 2010-03-25 17:17:58

+0

除非你有多個網絡服務器,在這種情況下你要做你應該做的事情。 (即使那樣,仍然有更好的選擇。) – 2010-03-25 17:18:12

1

兩件事情:

1 - 你不應該在會話中存儲這麼多,內存管理是一個問題。即,不要在會話中存儲對象,存儲指向事物的指針,而不是用戶的實例只存儲用戶ID。如果需要,可以添加信息檢索的緩存,但應該位於與會話分開的緩存層中。

2 - 使用數據庫會話,所以不存在有關服務器內存的關注,讓您可以根據需要輕鬆添加更多的Web服務器(注意,StateServer給你這個能力以及)。此外,這可以讓您重新使用應用程序池,而無需用戶丟失會話。這是我做這件事的主要原因 - 它可以讓我隨時部署。

治療會話這麼細究其原因,是他們流連用戶最近的請求後,一般爲10〜20分鐘。因此,如果在會話中存儲大型對象,來自多個不同會話的請求可能會佔用大量服務器內存。做更瘋狂的事情,比如在會話中存儲數據庫連接,可能會導致您使用所有可用的數據庫連接,這是因爲有太多內存在內存中等待會話過期。

理想的情況下,有沒有需要會話的「管理」。

+0

+1好得多的建議,存儲輕量級數據,而不是實際的對象/數據集/表等。 – JonH 2010-03-25 17:17:43

0

我認爲你誤會ASP.NET中的會話。你沒有明確地管理它們(儘管你可以,你很少會想),它們是由ASP.NET和IIS隱式創建和銷燬的。每個用戶都有一個會話。

現在任何你存儲用戶會話內部存儲器中存儲的服務器上,所以如果你經常放置大型物體在每個用戶會話,這將導致內存快速增長導致的性能和可擴展性的問題。

你需要在會​​話存儲的唯一數據是要橫跨要確保它不是提供給一個cookie或類似的結構在客戶端不同的頁面請求提供瞬態數據。

但是讀你在做什麼這極有可能是沒有必要的。由於您正在使用特定頁面和「導演」功能,因此這很可能適合放置在視圖狀態的頁面上作爲中介數據存儲。

0

沒有賴特的答案。這取決於併發用戶的數量,取決於內存的大小。 如果您在proc中擁有會話變量,則保持會話上的內容比在數據庫上更快。 我通常會盡量只保留我知道用戶在特定任務期間可能需要的內容,或者像您說的那樣,保留當前用戶的信息。

0

我的建議是:

  • 總結會議進入到IPerSessionCache接口
  • 有一個具體的實現這個接口
  • 使用具體類的代碼得到一個instace的/設置會話數據
  • 由此,您可以自由清理會話結束時的IPerSessionCache實例
  • 代碼不需要知道IPerSessionCache的位置實際存儲數據(即。它可以在會話或者數據庫或者cookie等)
  • 特別是如果你使用一個DI容器管理&創建實例

HTH你會對IPerSessionCache的壽命更好的控制。

相關問題