EJB 作為 J2EE 核心組件模型,效能優劣直接決定企業級應用成敗。本文歸納 12 大調優策略,涵蓋開發期設計原則 (粗粒度介面、Facade 模式、CMP 優先) 至部署期系統調優 (叢集、參數調整、負載測試),助您構建高吞吐、低延遲的任務關鍵型應用。
每次遠程方法調用涉及序列化、網路傳輸、安全檢查、事務邊界、激活/釋放等開銷。原則:每個 EJB 代表獨立業務實體,擁有獨立生命週期。依賴性物件 (如訂單明細) 應為 EJB 內部 Helper 類,而非獨立 EJB。
合併多個細粒度 getter/setter 為單一粗粒度方法,傳遞值物件 (Value Object/DTO) 一次性交換資料。
// 反面教材:多次遠程調用
public interface Person extends EJBObject {
String getFirstName(); void setFirstName(String n);
String getLastName(); void setLastName(String n);
int getPersonId(); void setPersonId(int id);
}
// 優化:單次調用交換完整資料
public interface Person extends EJBObject {
PersonData getPersonData(); // 回傳值物件
void setPersonData(PersonData d); // 接收值物件
}
public class PersonData implements Serializable { /* 欄位... */ }
JNDI 查找跨進程甚至跨機器,開銷大。採用 Session Facade 模式:

遠程客戶端逐筆調用 Entity Bean finder 回傳集合極其低效。Session Bean 內部以本地介面批量查詢,組裝為值物件集合一次性回傳。
Entity Bean 適合單筆邏輯行操作。千筆查詢會觸發 1001 次 SELECT (n+1 問題)。Session Bean 直接用 JDBC 批量處理,大幅降低資料庫往返次數。
CMP 由容器產生優化 SQL、支援關係映射、延遲載入、資料庫無關性。BMP 需手寫 JDBC 易出錯且難優化。
適用場景:少量資料、高併發讀取、多事務頻繁更新 (如用戶資料)。不適用:大量批次選取/插入/更新 — 改用 Session Bean 或 Entity Bean 內部粗粒度批量操作。
| 級別 | 特性 | 效能 |
|---|---|---|
| SERIALIZABLE | 完全序列化,最高隔離 | 最差 (鎖表/鎖頁) |
| REPEATABLE_READ | 可重複讀,防止幻讀 | 較差 |
| READ_COMMITTED | 讀已提交 (多數 DB 預設) | 良好 |
| READ_UNCOMMITTED | 讀未提交,可能髒讀 | 最佳 |
原則:在業務允許範圍內選擇盡可能低的隔離級別,平衡一致性與併發效能。
| 層面 | 工具範例 |
|---|---|
| CPU/記憶體/I/O/網路 | top, iostat, netstat (Unix) |
| Java 代碼剖析 | OptimizeIt, JProbe, JProfiler, PerfAnal, Heap Analysis Tool |
| 負載測試 | LoadRunner, e-LOAD, Bean-test, Microsoft WAS |
| SQL 追蹤 | Oracle TKPROF, SQL Trace |