雖然 Hibernate/MyBatis 更流行,但 CMP 2.x 仍是 Java EE 標準、工具鏈成熟(XDoclet、Eclipse WTP)的選擇。WebLogic 對 CMP 提供了優秀的 ORM 實現,關鍵在於正確配置緩存與併發策略。
EJB 容器維護實體 Bean 緩存/池,但默認每次事務開始調用 ejbLoad() 同步數據庫(Commit Option A/B/C),即使數據剛讀取過。這導致大量冗餘 SELECT,嚴重拖慢性能。
ALTER TABLE MY_ENTITY ADD VERSION INT DEFAULT 0;
-- 更新時:UPDATE ... SET ..., VERSION = VERSION + 1 WHERE ID = ? AND VERSION = ?
<verify-columns>Version</verify-columns>
<optimistic-column>VERSION</optimistic-column>
在 weblogic-ejb-jar.xml 中:
<concurrency-strategy>Optimistic</concurrency-strategy>
<cache-between-transactions>true</cache-between-transactions>
效果:緩存中實體可用時,容器跳過 ejbLoad(),直接使用內存對象。測試環境下應用性能提升 30%。
OptimisticConcurrencyException(RuntimeException),應用需捕獲處理(重試/提示用戶)delay-updates-until-end-of-tx=true(默認)時,異常在提交時才拋出WebLogic 7.x cache-between-transactions 常失效,8.1+ 已修復並可生產穩定運行。
VERSION 列Optimistic 併發 + cache-between-transactions=trueOptimisticConcurrencyException,提供用戶友好重試機制delay-updates-until-end-of-tx 減少數據庫寫入次數CMP 不等於低性能。通過樂觀鎖保障數據一致性,開啟跨事務緩存消除冗餘加載,WebLogic CMP 可勝任高性能企業級應用。核心在於理解容器默認行為,精準配置緩存與併發策略。