哪個更適合性能視圖狀態或會話
我必須將數千條記錄的數據儲存在數據表中並在回發時進行維護。哪個選項適合我的視圖狀態(我使用的)或會話。當我使用視圖狀態時,它會創建隱藏欄位來儲存它並減慢頁面載入速度。那麼在會話中儲存它是否有任何成本(伺服器端記憶體消耗和響應延遲)。請建議我解決方案
對於大量數據,Session 效率更高。如果您可以檢測到使用者何時完成了特定數據塊,請將 Session 變數設置為 null,以幫助減少記憶體成本。您不能總是這樣做,但 Session 最終會過期,然後記憶體將被回收。降低會話超時會有所幫助,但不要將其設置得太小,您不想切斷您的使用者。會話需要在您的 Web.config 文件中啟用。
以下是 Session 與 ViewState 的基本準則:
ViewState:ViewState 的二進制資料結構是經過 Base64 編碼後放入頁面的,也就是說它是原始二進制數據大小的 1.3333 倍(8/6)。為每個頁面視圖上傳和下載此數據。因此,如果您在 ViewState 中有很多內容,它會影響頁面響應時間。Base64 編碼可能經過高度優化,因此不會影響性能。每個頁面請求都會為 ViewState 分配然後釋放空間,因此這不是長期的記憶體命中。由於數據在頁面中,因此不會過期。
會話:在頁面載入之間,會話中的所有數據都保存在 Web 伺服器中。這樣可以保持頁面很小,它只需要攜帶 Session 標識符。不利的一面是,用於在 Session 中儲存數據的任何記憶體都將保持分配狀態,直到 Session 過期。我想知道會話是複制二進制數據還是只保留一個指針。與 Base64 編碼一樣,這可以進行高度優化,因此即使發生這種情況也不會影響性能。如果使用者在頁面瀏覽之間等待的時間過長,會話可能會過期。如果會話過期,它應該將使用者返回到網頁中的某個已知狀態。
這裡的另一個問題是,如果您在會話中儲存資訊,會話 ID 可能會在客戶端瀏覽器中的多個選項卡之間共享。您必須小心如何使用儲存在 Session 中的數據。確保您對此進行了測試,這樣您的使用者就不會得到意外的結果。
(注意:使用 ViewState 是 RESTful,Session 不是。)