2010-02-25 70 views
5

我正在使用Web應用程序使用Web服務返回的數據集。爲什麼我應該或不應該將Dataset,Datatable等作爲會話變量存儲在ASP.NET頁面中?

由於應用程序正在運行我存儲的數據集被用來在一個會話變量一遍又一遍當用戶瀏覽到要編輯的數據集內的表不同的頁面。

這個想法是,當應用程序加載時用戶將只需要等待一次數據,然後應用程序將使用會話變量,直到用戶保存他們所做的更改,當發生這種情況時,它會將編輯的表傳遞給服務來更新數據庫。

這個設計是否存在問題,以及數據集和數據表存儲爲會話變量?優點和缺點讓我知道。

回答

6

唯一的職業是:

  • 這不是重複去數據庫更快。也就是說,企業數據庫有足夠的緩存,你不經常需要。

的缺點是多方面的,但三個主要將是:

  • 如果數據從另一個會話(比如管理員用戶)改變,你的用戶的會話不知道
  • 內存分配可以是一個嚴重的問題很快
  • 如果你移動到一個服務器羣(儘管這可以通過使用緩存,而不是會議和密鑰對會話ID來緩解),你將不得不重新考慮你的整個設計,很可能使用數據庫來存儲會話數據 - 那麼你的效率理由就是了看起來有點弱

[編輯]正如其他人指出的那樣,在Session或Cache(或較小程度的應用程序)中保存任何東西時也存在問題,而無需將其保存在更持久的地方。如果一個會話過期,甚至重置自己(我已經看到硬件配置,導致會話開始和結束每個請求。雖然它保留會話ID,存儲在Session對象中的任何數據都會丟失。如果應用程序重新啓動原因,所有的Session,Cache和Application對象都被清除了,Cache對象可以隨時清除這些對象,只是因爲環境決定它想要其他內存空間。

如果您需要用戶能夠進行更改,然後點擊保存來保存它們,請保存一組單獨的狀態表,詳細說明當用戶點擊保存時應對主表進行的更改。使用密鑰在客戶端存儲cookie這對未來有很長的路要走;使用該cookie將您的狀態數據與用戶進行匹配。

+0

只是爲了澄清,它只是一個親,如果會話數據可以從數據庫重新加載,如果會話過期。在OP的情況下,會話包含未保存的更改,如果會話過期,則無法恢復。 –

+0

非常有效的一點,布賴恩。會添加一些關於這個答案的更完整的答案。 – pdr

+0

非常感謝你的精彩答案。時間做一點重構,因爲不這樣做的情況非常強烈。 –

3

一個很大的缺點:數據集是巨大的,因此保持所有的人都在服務器內存出了問題,特別是當用戶數開始增長。

1

特定於用戶的數據是? 如果沒有,則最終將「登錄的用戶數」存儲到數據表中。 也許你可以使用某種緩存機制,如果你對延遲感到困擾。

4

保持太多的會議有風險:

  • 許多用戶每一個大的會議將需要更多的服務器資源。
  • 如果用戶的會話過期(例如打電話等中斷),他的所有狀態都將丟失,他需要重新啓動該過程。在他瀏覽網頁時存儲他的數據可能會導致更愉快的體驗,如果他選擇稍後繼續。

如果您必須在會話中存儲某些內容,請執行您所描述的操作,也可考慮使用特定類型來代替通用數據集或DataTable。

+0

會話過期是這種情況不起作用的原因,即使是小規模。默認值是20分鐘左右。我已經讓用戶在單個頁面上超過45分鐘,而無需保存。 –

相關問題