構建高效能的 J2EE 應用程式,不僅僅是堆疊技術框架,更需要深入理解底層運作機制。以下整理出十大實戰技巧,助架構師與開發者快速掌握效能調校精髓。
所有 Java 應用的效能基礎,核心在於記憶體管理。這包含兩大任務:物件分配與垃圾回收(GC)。
常見陷阱包括游離物件(記憶體洩漏)與物件循環(頻繁創建/銷毀)。確保所有可達物件確實存活,並在失效時及時釋放引用,是避免洩漏的關鍵。
Servlet 應專注於請求分發與控制流程。若將業務邏輯硬塞進 Servlet,將失去 EJB 提供的快取(Cache)、資源池(Pooling)等擴展性機制,只能靠堆硬體(加 CPU、加機器)硬扛,架構彈性大打折扣。
EJB 2.0 引入 Local Interface,同一 JVM 內呼叫可繞過 RMI 序列化/反序列化、Stub/Skeleton 通訊開銷。流程從 9 步驟精簡為 5 步,效能提升顯著。除非需跨 JVM 遠端呼叫,一律採用 Local Interface。
Servlet 直接呼叫 Entity Bean 不僅效率低(頻繁遠端調用),維護性也差。引入 Session Facade 模式,由 Session Bean 統籌業務流程、透過 Local Interface 存取 Entity Bean,可:
頻繁呼叫遠端 EJB 的細粒度 getter/setter 會產生大量網路封包與序列化開銷。應將相關資料屬性封裝成資料傳輸物件(Data Transfer Object, DTO),一次呼叫傳遞完整資料結構,大幅降低遠端介面處理負載。
架構師不一定是 DBA,但必須確保:
CMP 容器管理持久化時,find() 方法常已快取實體資料,後續 ejbLoad() 可避免二次查詢。慎用 BMP 或自行實作快取邏輯,否則易導致重複資料庫存取。
線上產品目錄等「大量、長期不變、唯讀」場景,使用 Entity Bean 會引入不必要的事務開銷與多重資料庫存取。Fast Lane Reader 直接以 JDBC 讀取並映射為輕量物件,繞過 EJB 容器服務,效能提升數倍。
識別系統中可延後處理的資料庫密集型操作(如報表生成、通知發送),透過 JMS 非同步佇列剝離主流程。同步路徑越輕量,回應時間越穩定。
JNDI 查找(EJB Home、DataSource、JMS ConnectionFactory/Destination)涉及網路通訊與命名服務開銷。應在共享 InitialContext 實例上快取查找結果,避免重複查詢。雖部分鍵值實作已內建快取,但 narrow() 呼叫仍無法受益,自行快取更可靠。
高效能 J2EE 架構的核心在於:減少物件創建、縮短呼叫鏈路、善用容器服務、非同步削峰、精準快取。這十大技巧環環相扣,落地執行才是王道。