如果我有一個@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. 非託管bean中的EJB
- 5. JSF託管bean EJB注入
- 6. EJB無狀態會話bean和有狀態會話bean
- 7. 從無狀態服務設置sessionScoped bean?
- 8. RequestedScopre ManagedBean VS有狀態Bean
- 9. @觀察sessionscoped bean嗎?
- 10. LazyInitializationException與CDI託管Bean和有狀態會話Bean
- 11. EJB無狀態bean調度
- 12. Spring的EJB無狀態bean
- 13. 使用有狀態會話bean(EJB)
- 14. EJB訪問有狀態會話Bean NameNotFoundException
- 15. EJB 3.1丟棄有狀態會話bean
- 16. EJB 2.1有狀態會話bean
- 17. Web容器/ EJB容器:JSF託管Bean?
- 18. @ViewScoped託管bean中的@EJB導致java.io.NotSerializableException
- 19. 注入ejb到託管bean導致BeanInstantiationException
- 20. 將託管bean轉換爲EJB
- 21. 從託管bean調用EJB時出錯
- 22. 將JSF託管Bean注入EJB
- 23. 有狀態會話Bean vs無狀態會話Bean
- 24. 什麼是JSF託管bean和無狀態EJB的最佳模式
- 25. 在有狀態EJB中注入無狀態EJB不能按預期工作
- 26. EJB 3.1有狀態Bean的行爲與Singleton Bean相似
- 27. EJB注入vs僅JSF託管的豆
- 28. 如果我訪問它,如何更新JSF sessionscoped託管bean?
- 29. 將非SafeGuard從非託管狀態管理到託管狀態
- 30. EJB Spec 3.1有狀態轉換狀態
感謝您的非常詳細的答案。我認爲有狀態bean的使用被減少到非常非常特定的狀態 – arg20 2011-01-30 22:34:35