2011-01-07 39 views
0

我需要創建一個單身人士,將持有大量的數據爲特定的用戶。然而,我不清楚該單身人士在多用戶應用程序請求方面的行爲。單身人士行爲與ASP.NET中的多用戶請求

下面是這種情況:

在AppStart的事件我想加載所有用戶共同的數據(從SQL),它的ASP.NET存儲機制內的某處存儲爲一個集合。 (任何指向它應該去的地方將不勝感激!我正在考慮緩存。)

如果我將該數據存儲在緩存中,我還必須在Global.asax中創建一個靜態屬性,提供對來自緩存的數據的訪問。

因爲每當有什麼任何特定頁面的一個實例,或一般的處理程序,或者你有嘗試查詢使用LINQ的酒店從緩存加載數據...引入延遲這個數據這是不理想的。我需要這些數據立即可用。 (把它想象成大約5K行數據存儲在對象集合中......)

我正在考慮使用單例來獲取該數據並存儲它,但我不知道它在請求之間的行爲方式(和回發),以及應用程序實例在其持久性方面。

在PostAuthenticate事件我想從SQL得到一個集合的形式的用戶特定的數據。如果我將它存儲爲單例(與普通數據類似),我不清楚:

  1. 數據如何持久?
  2. 單身人士的範圍是什麼(應該是在用戶會話期間)。
  3. 我該如何確保數據可以立即用於需要消費的任何需求?
  4. 後衛對那個單身人士之間會發生什麼?
  5. 如果另一個用戶登錄,那麼會爲該特定應用程序實例創建該單例的另一個實例?

回答

1

HttpRuntime緩存是存儲全局共享信息的有效位置。您只需注意,它可以隨時清除,具體取決於緩存項目設置和可用內存。您用來訪問它的屬性需要能夠重新加載數據,如果它沒有在緩存中找到。

運行時緩存是一個進程內存儲,因此訪問對象的開銷很低。

或者,你可以存儲在一個共享的靜態屬性(「單身」)的數據,這將是提供給所有用戶(工人進程中。)

你不想存儲您的用戶/會話特定數據作爲單例,因爲靜態實例在所有請求之間共享。一種選擇是使用會話狀態來存儲用戶特定的數據。默認情況下,會話狀態也在處理中......

然而,與會話狀態有關的一個問題是,與運行時緩存不同,對象不會響應內存壓力進行清除,並且會保留在內存中,直到會話過期。如果您有很多併發會話並且您正在以會話狀態存儲大量數據,則這可能是一個可伸縮性問題。

另一種選擇是再次使用運行時緩存,但使用複合鍵,如「UserData |」 + UserId來存儲和檢索每個用戶的數據。這允許您設置緩存項目的時間限制,如果內存太低,緩存將清除舊/低優先級項目。