準則: 指出 Session Bean
這個準則討論如何指出和塑造 J2EE 應用程式的 Session Bean。
關係
相關元素
主要說明

簡介

這個準則以指出 Session Bean 為重點。準則:Session Bean 提供 Session Bean 的其他指引。準則:Enterprise JavaBean (EJB) 提供 EJB 的一般指引。

指出 Session Bean

控制類別通常很適合做為 Session Bean,因為 Session Bean 很適合提供控制邏輯,尤其是在此控制邏輯需要與用戶端交談的情況下。Session Bean 通常也指出為「商業層」中一群物件的外觀 (請參閱下列 Session Facade 型樣)。此外,從 J2EE 1.4 開始,Stateless Session Bean 可以用來實作 Web 服務。

如果您使用 J2EE 1.3,標準作法是透過階段作業 EJB 來處理所有遠端用戶端存取,這些 EJB 透過本端元件介面來操作相同 JVM 中的實體 EJB。

建模 Session Bean

請參閱準則:指出 Enterprise JavaBeans (EJB)

Stateful 與 Stateless 的比較

Session Bean 有兩種:Stateful 和 Stateless。指出 Session Bean 時有一部分是定義責任 - 其中一個責任可能是在呼叫之間保留用戶端狀態。

Stateful Session Bean 會保留用戶端和 EJB 儲存區之間交談的狀態資訊。Stateful Session Bean 實例只存在用戶端交談期間。Stateful Session Bean 通常會利用此資料為用戶端提供服務。Stateful Session Bean 提供的服務可能是協調與其他商業物件之間的交談(Session Bean 和 Entity Bean)。例如,含有採購物件的購物車可能以 Stateful Session Bean 來實作,因為可保留用戶端和應用程式互動時的資訊。因為 Stateful Session Bean 會分配給特定的用戶端,為了保留用戶端狀態,耗用的系統資源大於 Stateless Session Bean。儲存區會管理這些資源,通常是「取消」(寫入磁碟)Stateful Session Bean,然後在必要時再喚醒。

Stateless Session Bean 不會保留用戶端和 EJB 儲存區之間交談的狀態資訊。"Stateless" 其實就表示沒有用戶端交談狀態。因此,Stateless Session Bean 可以包含其他類型的狀態,例如任何用戶端可使用的資料庫連線。Stateless Session Bean 執行一般的服務,不使用先前方法呼叫中的用戶端狀態資料,而是接收所有相關輸入做為現行方法呼叫的參數,或在方法呼叫期間從其他來源取得資料 (例如,從 Entity Bean 或透過 JDBC 存取資料庫)。Stateless Session Bean 通常從備妥的儲存區中取出,然後視需要來分派以處理進入的要求。因為所有實例都是同等,Stateless Session Bean 不需要知道用戶端。如此可以提高效能和延展性。Stateless Session Bean 較有效率,因為一個實例可以在不連續的要求之間共用,而非「束縛」在活動的特定階段作業上。

通常,應該選擇最適合與用戶端交談的 Session Bean。有些策略可以強迫將 Stateful Session Bean 改為 Stateless Session Bean,例如將用戶端狀態儲存在用戶端,在每一次呼叫時重送,或在每一次呼叫方法時在資料庫中儲存和擷取用戶端狀態。不過,由於網路傳輸和資料存取的成本負荷,這些策略實際上可能會降低延展性。

如果要建立 Session Bean 來實作 Web 服務,您必須根據 JSR 1.3 API 規格的定義來使用 Stateless Session Bean。

準則:設計 J2EE 應用程式的狀態提出不同的方法來設計用戶端狀態。

Session Facade 型樣

Session Bean 通常做為外觀,在「商業層」內封裝物件之間的互動。Session Bean 可以隱藏這種複雜性,提供更簡單的介面給用戶端。「J2EE 型樣 - Session Facade 型樣」中詳細描述此型樣 ([ALU01])。

例如,通常建議將 Entity Bean 之間的邏輯抽出放入 Session Bean,以儘可能去除 Entity Bean 之間的糾葛。Entity Bean 可透過本端介面來存取,而 Session Bean 外觀可供遠端用戶端存取。有多個關係密切的 Entity Bean 時,這種方式最有效率。

Web 服務端點

如先前所述,Stateless Session Bean 可用來實作 Web 服務。這樣的 Bean 又稱為「服務實作 Bean」,必須符合下列需求:

  • 必須有預設的公用建構子。
  • 必須實作服務端點介面宣告的所有方法,且商業方法必須是 public,不得為 final 或 static。
  • 必須是 Stateless。
  • 類別必須是 public,不得為 final 和 abstract。

如需使用 Session Bean 來實作 Web 服務的相關資訊,請參閱 EJB 2.1JSR 109 規格。