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

Tomcat Cluster Session 複製:對象一定要 Serializable,且逐屬性序列化

     編輯:Java 相關知識

核心結論

Tomcat Cluster 複製 Session 時,會將其中的對象實例一併複製,前提是對象實作 java.io.Serializable。Tomcat 並非直接序列化 HashMap,而是逐一讀取屬性並單獨序列化,確保對象圖完整復制。

源碼證據:StandardSession.writeObject()

protected void writeObject(ObjectOutputStream stream) throws IOException {
    // 寫入標量屬性:creationTime, lastAccessedTime, maxInactiveInterval, isNew, isValid, thisAccessedTime, id
    // 收集可序列化屬性
    String keys[] = keys();
    ArrayList saveNames = new ArrayList();
    ArrayList saveValues = new ArrayList();
    for (int i = 0; i < keys.length; i++) {
        Object value = attributes.get(keys[i]);
        if (value instanceof Serializable) {
            saveNames.add(keys[i]);
            saveValues.add(value);
        }
    }
    // 寫入屬性數量及每個屬性
    stream.writeObject(new Integer(saveNames.size()));
    for (int i = 0; i < saveNames.size(); i++) {
        stream.writeObject(saveNames.get(i)); // key
        try {
            stream.writeObject(saveValues.get(i)); // value 逐個序列化
        } catch (NotSerializableException e) {
            stream.writeObject(NOT_SERIALIZED); // 標記不可序列化
        }
    }
}

對比 HashMap.writeObject() 直接寫入 key-value 交替流,Tomcat 額外過濾不可序列化對象,避免整個 Session 序列化失敗。

性能考量

同步 Session 開銷在同一局域網極小,遠小於帶來的橫向擴展收益。幾台工作站間的網路延遲可忽略不計。

最佳實踐

  1. 放入 Session 的對象必須實作 Serializable。
  2. 避免存放大對象、非序列化資源(DB 連接、Socket 等)。
  3. 監控 Cluster 傳輸流量,必要時啟用壓縮或調整複製策略(如 DeltaManager vs BackupManager)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved