2011-05-13 80 views
8

每當我要在會話中存儲任何東西,我拿起習慣減少的次數我必須做這樣的事情來訪問會話:Session變量VS局部變量

private List<SearchResult> searchResults; 

private List<JobSearchResult> SearchResults 
    { 
     get 
     { 
      return searchResults ?? (searchResults = Session["SearchResults"] as List<SearchResult>); 
     } 

     set 
     { 
      searchResults = value; 
      Session["SearchResults"] = value; 
     } 
    } 

我推理是如果在整個回發過程中多次使用該對象,則該對象必須經常從會話中檢索。然而,我完全不知道這究竟是否有助於表現,或者實際上只是浪費時間,或者甚至是一個壞主意。有沒有人知道如何在計算上花費大量時間將會話中的對象與上述方法進行比較?或者如果有圍繞這個的最佳實踐?

回答

3

取決於您正在使用什麼類型的會話存儲(有關更多信息,請參閱:here)。

如果您使用的是InProc存儲,那麼除非您經常訪問該對象,否則性能差異可能很小。但是,本地副本並沒有真正傷害任何一種方式。

-2

它取決於要存儲的數據大小,帶寬(互聯網或局域網),應用規模。如果數據量小,帶寬足夠好(局域網),規模在全世界範圍內(如Whitehouse.gov),我們應該將其存儲在客戶端(作爲表單隱藏參數)。在其他情況下(數據量非常大,帶寬非常低,規模很小(只有3-4人可以使用該應用程序),然後我們可以將其存儲在服務器端(會話)。還有很多其他在這個決策選擇中考慮它們的因素 另外我不建議你在會話對象中只使用一個字段在會話中創建類似Dictionary(HashMap in Java)的東西,並將其用作存儲,並且用戶應該傳遞這個字典得到該數據,需要提供幾個選項卡,打開你的網站用戶的能力URL的

例如,訪問需要搜索:。

http://www.mysite.com/SearchResult.aspx?search_result=d38e8df908097d46d287f64e67ea6e1a 
1

它肯定取決於你的S torage Unit,但這是一種很好的方法,因爲如果存儲不是InProc,它會阻止你從DeSerialization ...並且甚至在InProc的情況下它阻止了Boxing \ UnBoxing ...所以我的投票贊成你的方法。

1

我沒有看到你的方法錯了。唯一的缺點是當你的私人字段被初始化後,當你的(或別人的)代碼的某個其他部分改變會話值時,你的包裝屬性仍然會返回舊的值。換句話說,不保證你的財產實際上是第一次除了返回會話價值。

至於性能,我認爲在InProc的情況下幾乎沒有收益。可能類似於任何其他字典與變量存儲。但是,當您使用其他會話存儲模式時,它可能會有所不同。 如果你真的想知道你可以分析你的應用程序並找出答案);你甚至可以嘗試一些簡單的事情,比如2個跟蹤寫入和一些循環的會話讀/寫操作。

而這裏的會話存儲內部讀: http://www.codeproject.com/KB/session/ASPNETSessionInternals.aspx

+0

+1。您本地副本與會話之間數據不一致的可能性可能是錯誤的來源。 – Martijn 2011-05-13 10:23:34