如果我有一個@ManagedBean
即@SessionScoped
,爲什麼我會使用一個@Stateful
EJB?我以前用它來購物車並保持會話狀態,但由於託管bean將在用戶會話期間保留,我可以在那裏存儲狀態,然後調用SLSB獲取業務邏輯。那是對的嗎?如果是這樣,那麼有狀態的ejbs將留給更多具體的應用,比如當你需要交易等時?sessionscoped託管bean vs有狀態ejb
12
A
回答
13
很多時候無狀態會話bean可以用於很多業務問題。
有狀態並不一定意味着只有一個遠程服務器保持狀態,雖然這當然是其中一個選項。遠程Swing客戶端可以首先將一堆數據發送到有狀態會話Bean,保留到存根,然後發送一些操作這些數據的命令。這節省了客戶端每次都必須發送相同(大量)的數據。
在遠程用例中,當使用Web客戶端(瀏覽器)時,它確實有點反映了HTTP會話的使用情況。主要區別在於會話是每個bean,而在HTTP會話中,會話是許多bean共享的範圍。由於HTTP會話基於cookie,並且Cookie對於整個瀏覽器的域是全局的,所以HTTP會話不能直接支持來自同一客戶端的多個會話(例如,每個標籤或每個窗口)。這對於有狀態會話bean來說是微不足道的。
但是...
與遠程EJB交談的遠程Swing客戶端並不常見。
在您提到的問題中,您通常會使用本地EJB,並且您將在HTTP會話中存儲大部分狀態(小心共享!),並且這些日子在視圖範圍或對話範圍內。
那麼,最後,在這種情況下何時使用有狀態會話bean?
一個重要的用例是 JPA
。通常情況下,對於具有事務範圍的實體管理器,當實體跨越EJB方法調用的事務邊界時,它將被分離。如果你想(樂觀地)在用戶交互之間鎖定一個實體,這是不可取的。你會失去鎖定。
使用擴展持久化上下文時,實體保持連接狀態,並且在您從調用返回到有狀態會話bean時鎖定有效。這對於預覽功能非常有用,以確保在預覽後沒有其他人對實體進行任何更改。或者對於購物車來說,確保一段時間內該物品不能在購物車中出售給任何其他人。
相關問題
- 1. 會話範圍的託管bean vs有狀態的bean vs httpsession
- 2. 在SessionScoped CDI Bean中注入無狀態的EJB
- 3. 託管bean EJB注入
- 4. JSF託管bean EJB注入
- 5. EJB無狀態會話bean和有狀態會話bean
- 6. 從無狀態服務設置sessionScoped bean?
- 7. RequestedScopre ManagedBean VS有狀態Bean
- 8. LazyInitializationException與CDI託管Bean和有狀態會話Bean
- 9. Spring的EJB無狀態bean
- 10. EJB 3.1丟棄有狀態會話bean
- 11. EJB 2.1有狀態會話bean
- 12. EJB訪問有狀態會話Bean NameNotFoundException
- 13. @ViewScoped託管bean中的@EJB導致java.io.NotSerializableException
- 14. Web容器/ EJB容器:JSF託管Bean?
- 15. 將託管bean轉換爲EJB
- 16. 在有狀態EJB中注入無狀態EJB不能按預期工作
- 17. 如果我訪問它,如何更新JSF sessionscoped託管bean?
- 18. EJB Spec 3.1有狀態轉換狀態
- 19. 託管Bean繼承
- 20. bean和jsf驗證註釋inisde託管bean vs實體bean
- 21. 託管bean作爲託管屬性
- 22. JSF託管bean
- 23. 擴展@Named @SessionScoped bean
- 24. CDI中的PostConstruct SessionScoped託管的豆子
- 25. 與有狀態,無狀態和單例EJB bean相同的結果
- 26. 用戶角色和工作流程狀態xpages和託管bean
- 27. 無狀態EJB中的靜態vs實例成員
- 28. 從EJB @Asynchronous調用中訪問CDI SessionScoped bean
- 29. 刪除客戶端中的有狀態EJB bean
- 30. 如何使用JPA映射有狀態的ejb 3.1會話bean
感謝您的非常詳細的答案。我認爲有狀態bean的使用被減少到非常非常特定的狀態 – arg20 2011-01-30 22:34:35