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

WebLogic IP 變更導致 SubCoordinator 不可用事務回滾根因分析

     編輯:Java 相關知識

現象:開發機遷移(公司 IP 10.182.216.189 → 家庭 IP 192.168.0.51),XA 事務提交拋出:

RollbackException: SubCoordinator 'server_2+10.182.216.189:7021+driver_test_domain+t3+' not available

PropagationContext 中攜帶的 scURLs 為新 IP,但協調者內部仍持有舊 IP 的 CoordinatorDescriptor。

根因追蹤

  1. TLOG 恢復殘留舊描述符:啟動時 StoreTransactionLoggerImpl.recover() 讀取舊 TLOG,為 server_2 創建 ServerCoordinatorDescriptor(URL 含舊 IP),放入 CoordinatorDescriptor.knownServers(以 domain+serverName 為 Key)。
  2. 鍵值衝突:新請求攜帶新 IP 的 scURL,解析出相同 ServerID (driver_test_domain+server_2),getOrCreateSCInfo() 誤認為已存在,直接復用舊 SCInfo(含不可用的舊 IP Stub)。
  3. 提交失敗:協調者嘗試通過舊 IP Stub 通知 SubCoordinator 提交,RMI 失敗,事務回滾。

核心代碼證據

// CoordinatorDescriptor.getOrCreate() 僅按 ServerID 去重
static CoordinatorDescriptor getOrCreate(String aCoURL) {
  CoordinatorDescriptor cd = (CoordinatorDescriptor) knownServers.get(getServerID(aCoURL));
  if (cd == null) cd = new CoordinatorDescriptor(aCoURL);
  return cd;
}

// ServerID = domainName + serverName,忽略 IP/Port
final boolean representsCoordinatorURL(String aCoURL) {
  return getServerID().equals(getServerID(aCoURL));
}

解決方案與驗證

  • ✅ 刪除 TLOG 文件($DOMAIN_HOME/servers/server_2/data/store/.../tlog)重啟,強制重建描述符,問題即時恢復。
  • ⚠️ 端口變更同理會觸發,因比較邏輯同樣忽略 Port。

架構級建議

  1. 生產環境固定 Listen Address/IP,避免 DHCP/漂移導致 TLOG 與運行時不一致。
  2. 遷移/擴容前清理 TLOG,或使用共享存儲(SAN/NFS)保證 TLOG 與集群節點綁定。
  3. 監控 TLOG 健康度:定期檢查 ServerCheckpoint 恢復日誌,及早發現描述符不匹配。
  4. 向 Oracle 提交 Bug/RFE:建議 representsCoordinatorURL 比較納入 IP/Port,或提供 migrateCoordinatorDescriptor 管理操作。

🔍 此問題本質是 邏輯標識與物理端點解耦不徹底。WebLogic 以 Domain+ServerName 為邏輯身份,卻在 TLOG 恢復時固化物理端點,缺乏端點變更感知機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved