2009-05-07 29 views
3

我試圖讓自己放棄ASP.NET中的Session變量(我來自Windows編程背景)中的所有東西,而且我通常完全停止顯式地將任何內容存儲在會話變量。任何人都可以給出一些關於你認爲會話變量可接受的用法的指導嗎?在ASP.NET中接受使用Session變量掙扎

下面是一個具體的例子...我從數據庫加載一個業務對象並填充和編輯屏幕。用戶可以編輯這些值並保存。舊的方式我會加載業務對象,加載我的表單,並將業務對象保存到會話變量。如果用戶單擊保存,我將從會話變量中檢索業務對象,替換已編輯的值,然後保存它。我從數據庫加載業務對象並加載表單的新方法。用戶將編輯這些值並點擊保存。我會從數據庫重新加載我的業務對象,替換編輯的值,然後保存它。我不是網絡編程專家,但我覺得第一種方法是錯誤的,因爲使用會話變量很糟糕,我覺得第二種方法是錯誤的,因爲它只是一種蹩腳的方式(加載業務對象兩次)。這裏不要考慮任何形式的緩存。我將如何處理?

回答

7

我並沒有因爲在回帖中重新加載數據庫中的業務對象而感到憤怒,以保存用戶更改。

該對象必須來自該回發的某個位置,並且與抓取特定對象等快速DB調用相關的有限開銷可能是您最好的選擇。

您的選項獲得該業務對象回內存後回:

  • 從數據庫中再次得到它。缺點:一些(小)額外的數據庫開銷
  • 將其保存在用戶的會話中。缺點:如果多個用戶可能正在訪問該對象並且最糟糕的話,可能仍然擊中數據庫(如果會話狀態存儲在那裏)或者使用大量內存(如果會話狀態存儲在那裏)並且可能存儲多個副本,如果ASP.NET無論出於何種原因將其清除,那麼該對象可能會在用戶點擊提交時消失。
  • 來自緩存。缺點:使用一些額外的內存,如果緩存不存在,你仍然需要訪問數據庫,但是我會投入大筆資金,任何應用程序都有許多更大的瓶頸來使用緩存。
  • Viewstate。您可以將對象存儲在Viewstate中(將其發送給客戶端,然後客戶端將其發回)。缺點:在我看來,最糟糕的解決方案。將其添加到Viewstate意味着它將通過下游和上游的導線並導致頁面大小變大。 Session不是最好的,但Viewstate是魔鬼。
1

你有很多用戶嗎?

如果您的網站體積較小,將會話存儲在業務對象中可能會正常。

如果您使用SQL Server存儲會話,那麼無論如何您都有效地從數據庫中加載您的業務對象。作爲一個經驗法則,我傾向於使用Session來存儲適用於用戶會話生活的信息。特定於單個Web表單的業務對象並不適合此類別。對於大批量的網站,這種策略可能會幫助您更好地擴展。這取決於所有有關因素。

:)

0

更新前重新加載對象數據庫可能非常危險。您最終可能會錯過任何可能的併發衝突。

例如如果發生這種流動:

  1. 顯示編輯屏幕顧客1計算機1
  2. 顯示編輯屏幕顧客1上的計算機2
  3. 手柄更新顧客1從計算機1
  4. 從計算機2處理客戶1的更新

(4)可能會失敗,因爲的併發衝突,即更新正在覆蓋計算機2不知道的更改。但是通過從數據庫重新加載,您忽略了這些問題並實現了最後一次更新。

因此,對於這種情況,我認爲將原始實體放入會話中(或在表單上的隱藏字段中),如果您關心併發性是絕對正確的。

不要再提很多人不喜歡打的數據庫中額外的讀...

+0

是的,很明顯,我需要利用時間戳字段,但值得一提的。 – 2009-05-07 04:46:30