會話 Bean 定位
對應 MVC 中 Controller,封裝業務邏輯、協調 Entity Bean、存取資源。分為無狀態與有狀態兩類。
無狀態 Session Bean (@Stateless)
- 特徵:不維護客戶端會話狀態,實例間無差別。
- 生命週期:實例化 → 放入池 → 多客戶共用 → 客戶消亡 Bean 仍存活 → 容器銷毀。
- 優勢:實例池機制支撐高併發、可伸縮性強、效能最佳。
- 注意:若 Bean 有實例變數,會被所有調用者共享,導致線程安全問題,實務上應避免非最終態欄位。
有狀態 Session Bean (@Stateful)
- 特徵:維護特定客戶端會話狀態,狀態駐留記憶體不持久化。
- 生命週期:每客戶專屬實例 → 客戶存活期間保持狀態 → 客戶結束/移除 → Bean 銷毀。
- 機制:容器以快取 (caching) 管理實例,而非池化;支援
@PrePassivate/@PostActivate 序列化/還原。
- 適用:購物車、多步驟精靈流程等需跨請求保持狀態場景。
選型指南
| 場景 | 推薦 | 理由 |
| 高併發、無會話狀態業務 (查詢、統計、批次) | @Stateless | 池化複用、無同步開銷、線性擴展 |
| 多步驟交互、需記住用戶中間狀態 | @Stateful | 天然支援會話狀態、容器管理生命週期 |
| 集群環境 | @Stateless 優先 | 有狀態需 Session 複製/持久化,增加複雜度 |