首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

EJB Session Bean 開發規範全解析:狀態選型、接口契約與最佳實踐

     編輯:Java 程式設計入門

Session Bean 定位:業務邏輯的核心載體

Session Bean 封裝業務流程、協調事務、提供遠程訪問,不直接持久化數據(由 Entity Bean/JPA 負責)。其實例生命周期由容器管理,支持聲明式事務、安全、並發控制。

兩大核心類型:Stateful vs Stateless

維度Stateful Session Bean (SFSB)Stateless Session Bean (SLSB)
狀態保持維護客戶會話狀態(實例字段)無實例狀態,線程安全
實例關聯專屬於單一客戶池化共享,任意客戶調用
激活/鈍化容器自動序列化/反序列化至磁盤無需
典型場景購物車、多步向導、用戶會話上下文CRUD 服務、批量處理、工具類方法、Web Service 端點
性能/擴展性較差(佔用內存、需鈍化)極佳(池化、高併發、易集群)
事務邊界跨方法調用維持事務單方法內完成事務

開發規範:三大介口/類契約

1. Bean 實現類

  • 實現 javax.ejb.SessionBean(EJB 2.x)或無介口(EJB 3+ 用註解)。
  • ejbCreate(...):初始化邏輯,參數/返回類型符合 RMI-IIOP(可序列化、非基本類型用包裝類)。
  • setSessionContext(SessionContext ctx):容器注入上下文,可獲取 UserTransaction、EJBHome、安全主體等。
  • ejbActivate()/ejbPassivate():SFSB 鈍化/激活鉤子,釋放/恢復非序列化資源(JDBC 連接、Socket、線程)。
  • ejbRemove():清理資源。
  • 方法簽名:public、非 static/final、拋出 RemoteException (EJB 2.x) 或應用異常。

2. Home 介口 (EJB 2.x) / 無介口視圖 (EJB 3+)

  • create(...) 對應 ejbCreate,拋出 CreateException、RemoteException。
  • 返回 Remote 介口(EJB 2.x)或 Bean 本地/遠程視圖(EJB 3+)。
  • SLSB 通常單一無參 create();SFSB 可多重載 create(...) 接收初始化參數。

3. Remote/Business 介口

  • 定義業務方法,參數/返回值為 RMI-IIOP 合法類型(基本類型、Serializable、Remote 介口、集合/數組)。
  • 方法拋出 RemoteException (EJB 2.x) 或應用異常(EJB 3+ 不強制)。
  • 不暴露內部實現細節(如 Entity Bean、DAO)。

EJB 3.x 註解式開發範例

// 無狀態:預設池化、線程安全、高性能
@Stateless
@Remote(OrderService.class)
public class OrderServiceBean implements OrderService {

    @PersistenceContext
    private EntityManager em;

    @Resource
    private SessionContext ctx;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Order createOrder(Customer customer, List items) {
        Order order = new Order(customer);
        for (OrderItem item : items) {
            order.addItem(item);
            em.persist(item);
        }
        em.persist(order);
        return order;
    }

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public Order findOrder(Long id) {
        return em.find(Order.class, id);
    }
}

// 有狀態:維護會話狀態,需客戶端保持引用
@Stateful
@Remote(ShoppingCart.class)
public class ShoppingCartBean implements ShoppingCart {

    private List items = new ArrayList<>();

    @PostConstruct
    public void init() { items.clear(); }

    public void addItem(Item item) { items.add(item); }

    public List getItems() { return Collections.unmodifiableList(items); }

    @Remove
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void checkout(PaymentInfo payment) {
        // 處理訂單、付款、清空購物車
        items.clear();
    }

    @PrePassivate
    public void passivate() { /* 釋放非序列化資源 */ }

    @PostActivate
    public void activate() { /* 恢復資源 */ }
}

選型決策指南

  1. 默認選 Stateless:90%+ 業務場景無需會話狀態,SLSB 性能最佳、擴展最易。
  2. 確需會話狀態才用 Stateful:多步業務流程、用戶私有上下文、跨請求事務。
  3. 避免在 SFSB 中持有重資源:JDBC 連接、大集合、線程池 → 鈍化時會序列化失敗或佔用巨大磁盤空間。
  4. 集群環境:SFSB 需配置會話複製(Replication)或粘性會話,增加基建複雜度。
  5. 併發訪問:SFSB 默認串行化調用(@AccessTimeout),並發性能差;SLSB 天然並發。

常見錯誤與避坑

錯誤後果修正
SLSB 使用實例字段保存請求數據線程安全 Bug,數據錯亂改用方法局部變量或 ThreadLocal
SFSB 未實現 Serializable鈍化失敗,容器報錯實現 Serializable,聲明 serialVersionUID
業務方法拋出 RuntimeException 導致事務回滾但未記錄日誌難以排查捕獲轉為應用異常或用 @ApplicationException(rollback=true)
Remote 介口傳遞 Entity Bean 實例序列化巨大對象圖,性能災難傳遞 DTO/VO,或用 JPA 脫管實體

總結

Session Bean 是 EJB 容器管理業務邏輯的核心組件。Stateless 為默認首選,Stateful 僅在確需會話狀態時使用。EJB 3+ 註解極大簡化了開發,但對生命周期、事務屬性、序列化、併發語義的理解仍是寫出健壯企業級應用的關鍵。現代架構常以 Spring + JPA 替代 EJB,但其核心概念(事務邊界、狀態管理、容器服務)具有普世價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved