<Error> <HTTP Session> <BEA-100087>
The jdbc session data for session id: ... has been modified by another server in the cluster.
java.sql.SQLException: ORA-00001: unique constraint (SYSTEM.SYS_C003007) violated
叢集環境下,Session 持久化至資料庫表 wl_servlet_sessions,主鍵為 (wl_id, wl_context_path)。衝突表示嘗試插入重複的 wl_id。
CREATE TABLE wl_servlet_sessions (
wl_id VARCHAR2(100) NOT NULL,
wl_context_path VARCHAR2(100) NOT NULL,
wl_is_new CHAR(1),
wl_create_time NUMBER(20),
wl_is_valid CHAR(1),
wl_session_values LONG RAW,
wl_access_time NUMBER(20),
wl_max_inactive_interval INTEGER,
PRIMARY KEY (wl_id, wl_context_path)
);
LastAccessTimeTrigger 批次更新 triggerLAT(尚未寫入 DB,triggerLAT=2 在記憶體)。syncSession(),檢查 DB 記錄的 wl_access_time (2) 不等於記憶體 dbLAT (1) 或 triggerLAT (0),判定記錄不存在 → 呼叫 dbCreate() 插入 → ORA-00001。Cache 淘汰與 Trigger 批次更新的競態條件:Trigger 持有的 Session 參考未被視為 GC Root,導致 Session 被 Cache 移除後仍在 Trigger 佇列中,造成同一 Session ID 存在兩個記憶體實例。
session-descriptor > cache-size(預設 1024)減少淘汰機率。前端代理(Apache mod_wl, F5, Nginx 等)未正確維持 Session 親和性,導致同一 Session ID 的請求分散到叢集不同節點:
dbCreate() → 唯一鍵衝突。DebugWLProxy 或 Apache mod_jk 日誌,確認是否發生 Failover。JSESSIONID 路徑、Domain 設定是否正確。Source IP Affinity 或 Cookie Insert 模式。wl_servlet_sessions 主鍵改為單獨 wl_id(若應用允許),或增加 server_id 列區分節點(需自訂 JDBC Store)。SELECT wl_id, COUNT(*) FROM wl_servlet_sessions GROUP BY wl_id HAVING COUNT(*) > 1 發現潛在重複。