EJB (Enterprise JavaBeans) 作為 J2EE 核心組件,其遠程調用開銷、事務管理、資源池配置直接影響系統吞吐與延遲。本文總結項目實戰中提煉的 10 條優化技巧,涵蓋門面模式、粒度設計、本地接口、瞬態字段、事務屬性、超時配置、鎖持有時間、池參數、事務隔離級別等維度,並以 JBoss + MySQL 為例給出具體配置片段。
建立 ServerFacade 統一緩存 EJB Home Handle,將多個 Entity Bean 的 Remote/Local 調用聚合在單一 Session Bean 中,減少 JNDI 查找與網絡往返。客戶端僅調用 Facade 暴露的粗粒度業務方法。
避免「細粒度 Getter/Setter」式遠程調用(每次調用攜帶 RMI 開銷)。設計符合業務語義的粗粒度方法(如 placeOrder(OrderDTO) 替代多次 setItem()/setAddress())。
成功查找 Remote 接口後,將其數據拷貝至可序列化的 DTO/VO,後續業務邏輯操作本地對象,避免持續持有 Remote 引用產生網絡調用。
客戶端與 EJB 部署在同一 JVM 時,@Local 接口繞過 RMI 序列化/反序列化與網絡棧,直接方法調用,性能提升數量級。
public class DemoCMP implements EntityBean {
transient EntityContext entCtx; // 容器上下文,無需持久化
transient InitialContext initCtx; // JNDI 上下文,臨時使用
public String id; // 業務字段
public String description;
// ...
}
在 ejb-jar.xml 中為 Session Bean 的只讀/查詢方法禁用事務上下文傳播,避免不必要的事務管理開銷:
<container-transaction>
<method>
<ejb-name>BookSessionBean</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>NotSupported</trans-attribute>
</container-transaction>
JBoss 配置 ${jboss.home}/server/${conf}/conf/jboss-service.xml:
<mbean code="org.jboss.tm.TransactionManagerService" name="jboss:service=TransactionManager">
<attribute name="TransactionTimeout">300</attribute> <!-- 300 秒 -->
</mbean>
事務內盡量減少數據庫行鎖持有範圍與時長:
• 延遲獲取鎖(晚開啟事務)
• 提前釋放鎖(早提交/回滾)
• 避免事務中調用外部服務/長耗時計算
以 JBoss MySQL 連接池 mysql-service.xml 為例:
<mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"
name="jboss.jca:service=LocalTxPool,name=MySqlDS">
<attribute name="MinSize">0</attribute>
<attribute name="MaxSize">50</attribute>
<attribute name="BlockingTimeoutMillis">5000</attribute>
<attribute name="IdleTimeoutMinutes">15</attribute>
<attribute name="Criteria">ByContainer</attribute>
</mbean>
參數含義:MinSize 最小連接、MaxSize 最大連接、BlockingTimeoutMillis 獲取連接最長等待、IdleTimeoutMinutes 空閒回收、Criteria 匹配策略。
成本遞增順序:
READ_UNCOMMITTED (髒讀) < READ_COMMITTED (不可重複讀) < REPEATABLE_READ (幻讀) < SERIALIZABLE (完全串行)。
根據業務容忍度選擇最低可接受級別,避免過度串行化導致並發崩潰。
EJB 性能優化本質是 減少網絡往返、降低序列化開銷、縮短鎖持有、匹配資源池容量、精準控制事務邊界。上述 10 條技巧需結合具體業務場景、壓測數據逐項驗證,而非盡數套用。