準則: 設計 Enterprise JavaBeans (EJB)
這個準則討論如何設計 J2EE 應用程式的 Enterprise JavaBeans (EJB)。
關係
相關元素
主要說明

簡介

這個準則以設計 EJB 為重點。有關 EJB 的其他指引,例如,如何指定和塑造,請參閱工作成果準則:EJB

下列準則提供設計特定 EJB 類型的特定指引:

本端與遠端介面的比較

概念:J2EE 概觀:Enterprise JavaBeans 提出本端與遠端介面的比較。

本端介面比遠端介面更有效率。如果有特定的用戶端總是位在 EJB 本端,則應該提供本端介面。

有關本主題的更具體的指引,請參閱特定 EJB 類型的準則。

參數傳遞

效能很明顯受到遠端呼叫數目及每一個呼叫上傳送的資料量所影響。只要提供特定的呼叫,傳回遠端用戶端需要的所有資料,就可以解決這個問題。例如,Session Bean(當做一組相關 Entity Bean 的外觀)可以將多個 Entity Bean 的資料複製到序列化值物件,然後在單一遠端呼叫上傳回這項資料。詳情請參閱 Core J2EE Patterns - Value Object Pattern ([ALU01]。

這也必須考慮保持介面愈普通愈好,且避免傳送太多不必要的資料。

交易

區分交易表示起始、確認及放棄交易。EJB 設計師必須決定是否實作 Bean 管理的交易區分,或儲存區管理的交易區分。您必須在應用程式執行的商業邏輯順序中決定交易界限的位置。如需相關資訊,請參閱作業:使用案例設計、建模交易概念:J2EE 概觀交易管理章節。

請儘量使用儲存區管理的交易。這樣可讓程式碼保持簡單,讓開發人員專注於應用程式的商業邏輯。

概略劃分的交易,整體效能通常較佳。假設您對 EJB 發出一連串的方法呼叫(例如 getX、getY 及 setZ)。根據預設值,每一個方法會在新的交易中執行,導致效能降低。若要在相同的交易中呼叫這些方法,請建立另一個方法,例如階段作業 EJB 的 processXYZ 方法,並將被呼叫方法的交易屬性設為 Required,表示要使用現有的交易(亦即,Session Bean 中呼叫方法的交易)。 

安全

概念:J2EE 平台概觀 - 安全描述基本的 EJB 安全概念。

您可以定義安全角色方法權限來定義 EJB 的安全需求。安全角色和方法權限是在 EJB 的部署描述子中定義。由伺服器(使用管理工具)負責將安全角色對映至使用者或使用者群組。 

安全角色定義一組類型相似的活動,以單一名稱組成。方法權限授予特定安全角色去呼叫方法的權限。例如,假設有一個實體 EJB Employee,具有 setAddresssetSalary 等方法。manager 安全角色可能被授予呼叫 setAddress 和 setSalary 方法的權限,employee 安全角色可能只被授予呼叫 setAddress 方法的權限。  

有時不可能在部署描述子中以宣告式方法權限來支援應用程式的安全需求。在此情況下,您可以利用 javax.ejb.EJBContext 介面的 getCallerPrincipal 和 isCallerInRole 方法。 

計時器服務

因為 J2EE 1.4(更準確地說是 EJB 2.1)Stateless Session Bean 和訊息驅動 Bean 可以利用計時器,透過 EJB 計時器服務排定批次程序。

提供方法為時間型1事件排定回呼的 EJB 計時器服務。儲存區為時間事件提供可靠和交易式的通知服務。計時器通知可能排定在特定的時間、在經過一定期間之後或一段特定的循環間隔上發生。

計時器服務由 EJB 儲存區實作,企業 Bean 可以透過 EJBContext 介面來存取此服務。

EJB 計時器服務是粗略的計時器通知服務,專門用於建模應用程式層次的流程,不適用於建模即時事件。

直接存取與 Entity Bean 的比較

使用 Entity Bean 來保存持續資料,有一套標準、功能豐富的機制可存取持續資料。用戶端不必瞭解是否決定使用 Bean 管理的持續性或儲存區管理的持續性,設計起來更有彈性。EJB 可以利用交易、資源管理、負載平衡及 J2EE 環境提供的其他特性。

不過,有時您可能想要直接存取資料庫,避免使用 Entity Bean。比方說,如果單一用戶端總是以唯讀方式存取資料,則直接存取資料庫會更有效率。

如果您直接存取資料庫(例如,從 Stateless Session Bean),請將所有資料庫存取封裝在「資料存取物件」類別中。這就是一個隱藏並封裝底層儲存機制的 Java 類別,在資料來源的介面改變時,可以隔離變更。請參閱 Core J2EE Patterns - Data Access Object Pattern ([ALU01]。

資料庫連線

實際上,所有 EJB 儲存區都支援連線儲存區作業 - 用戶端之間共用一組已建立的連線。這些連線會視需要來分配給 EJB。EJB 可以直接取得連線,不必再建立和起始設定連線。連線歸還給儲存區之後,就會循環再利用。儲存區大小應該要有足夠的備妥連線可以回收使用的連線。

對於使用儲存區管理持續性的 Entity Bean,由儲存區管理資料庫連線及資料庫連線儲存區的存取。

對於使用 Bean 管理持續性的 Entity Bean(或存取資料庫的階段作業或訊息驅動 EJB),開發人員要負責撰寫連線常式。適用的準則如下:

  • 在 DAO 類別中隔離資料庫存取程式碼。
  • 不要將資料庫的實際 URL 寫在程式中 - 使用可透過 Java 命名和目錄介面 (JNDI) 查閱來擷取的邏輯名稱。這樣可讓您在多個應用程式中重複使用 EJB,甚至使用不同的資料庫名稱。
  • 一般而言,使用連線儲存區,且只在必要的時間內保留連線。例如,Entity Bean 可能連接、更新表格的一列,然後切斷連線。這樣可讓許多 EJB 共用相同的連線。JDBC 規格包含連線儲存區的支援。