首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

EJB 效能優化:值對象模式消除 RMI 遠端調用開銷

     編輯:Java 相關知識

問題場景

實體 Bean DVD 有 5 個屬性 (id, title, releaseDate, producer, director)。客戶端逐一呼叫 getter 需 5 次 RMI 往返,網路延遲、序列化開銷成倍放大,高併發下系統崩潰。

值對象模式

定義可序列化的純資料載體 DVDInfo,一次 RMI 呼叫攜帶完整快照:


public class DVDInfo implements Serializable {
    private int id; private String title; private Date releaseDate;
    private Person producer; private Person director;
    // getter/setter,無 RemoteException
}

遠端介面擴展


public interface DVD extends EJBObject {
    DVDInfo getInfo() throws RemoteException;   // 一次性取回所有屬性
    void setInfo(DVDInfo info) throws RemoteException; // 一次性更新
    // 保留原有細粒度 getter/setter 供內部/特殊場景用
}

Bean 實作


public DVDInfo getInfo() {
    DVDInfo info = new DVDInfo();
    info.setId(this.id);
    info.setTitle(this.title);
    info.setReleaseDate(this.releaseDate);
    info.setProducer(getProducer()); // 容器內本地調用,無 RMI 開銷
    info.setDirector(getDirector());
    return info;
}
public void setInfo(DVDInfo info) {
    setTitle(info.getTitle());
    setReleaseDate(info.getReleaseDate());
    setProducer(info.getProducer());
    setDirector(info.getDirector());
}

效果與風險

  • 效能提升:5 次 RMI → 1 次,延遲降低 80% 以上。
  • 風險:值對象為快照,長時間持有可能讀到髒數據。對策:用完即棄,需最新數據再呼叫 getInfo()。
  • 適用:屬性較多、頻繁整體讀寫、容許最終一致性的場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved