2011-01-30 89 views
12

如果我有一個@ManagedBean@SessionScoped,爲什麼我會使用一個@Stateful EJB?我以前用它來購物車並保持會話狀態,但由於託管bean將在用戶會話期間保留,我可以在那裏存儲狀態,然後調用SLSB獲取業務邏輯。那是對的嗎?如果是這樣,那麼有狀態的ejbs將留給更多具體的應用,比如當你需要交易等時?sessionscoped託管bean vs有狀態ejb

回答

13

很多時候無狀態會話bean可以用於很多業務問題。

有狀態並不一定意味着只有一個遠程服務器保持狀態,雖然這當然是其中一個選項。遠程Swing客戶端可以首先將一堆數據發送到有狀態會話Bean,保留到存根,然後發送一些操作這些數據的命令。這節省了客戶端每次都必須發送相同(大量)的數據。

在遠程用例中,當使用Web客戶端(瀏覽器)時,它確實有點反映了HTTP會話的使用情況。主要區別在於會話是每個bean,而在HTTP會話中,會話是許多bean共享的範圍。由於HTTP會話基於cookie,並且Cookie對於整個瀏覽器的域是全局的,所以HTTP會話不能直接支持來自同一客戶端的多個會話(例如,每個標籤或每個窗口)。這對於有狀態會話bean來說是微不足道的。

但是...

與遠程EJB交談的遠程Swing客戶端並不常見。

在您提到的問題中,您通常會使用本地EJB,並且您將在HTTP會話中存儲大部分狀態(小心共享!),並且這些日子在視圖範圍或對話範圍內。

那麼,最後,在這種情況下何時使用有狀態會話bean?

一個重要的用例是 JPA。通常情況下,對於具有事務範圍的實體管理器,當實體跨越EJB方法調用的事務邊界時,它將被分離。如果你想(樂觀地)在用戶交互之間鎖定一個實體,這是不可取的。你會失去鎖定。

使用擴展持久化上下文時,實體保持連接狀態,並且在您從調用返回到有狀態會話bean時鎖定有效。這對於預覽功能非常有用,以確保在預覽後沒有其他人對實體進行任何更改。或者對於購物車來說,確保一段時間內該物品不能在購物車中出售給任何其他人。

+0

感謝您的非常詳細的答案。我認爲有狀態bean的使用被減少到非常非常特定的狀態 – arg20 2011-01-30 22:34:35