Dead Connection Detection (DCD) 專為客戶端異常斷電/崩潰未正常斷開會話場景設計。服務端主動發起探測,機制流程:
SQLNET.EXPIRE_TIME (分鐘) 設置定時器;| 參數 | 位置 | 建議值 | 說明 |
|---|---|---|---|
| SQLNET.EXPIRE_TIME | sqlnet.ora (服務端) | 10 (分鐘) | 探測間隔,太小增加網絡/CPU 開銷,太大延遲資源釋放 |
| TCP_KEEPALIVE | OS 內核 | 依平台 | TCP 層心跳,DCD 依賴底層協議棧超時重傳機制 |
DCD 探測包 → TCP 發送 → 無 ACK → TCP 重傳 (指數退避) → TCP 放棄 → 通知 SQL*Net 失敗 → 釋放資源。
關鍵洞察:TCP 重傳超時通常達數分鐘 (Linux 默認 ~15 分鐘),導致 DCD 實際生效遠晚於 EXPIRE_TIME。
EXPIRE_TIME=1 觀察清理耗時 → EXPIRE_TIME=5 再觀察,若耗時增加 ~4 分鐘,確為 TCP 重傳主導;/proc/sys/net/ipv4/tcp_keepalive_time (默認 7200s) → 建議 300s;/proc/sys/net/ipv4/tcp_keepalive_intvl (默認 75s) → 建議 30s;/proc/sys/net/ipv4/tcp_keepalive_probes (默認 9) → 建議 5;TRACE_LEVEL_SERVER = 16 (sqlnet.ora);DCD probe 關鍵字確認探測包發送/接收;V$SESSION 中 LAST_CALL_ET 與 SQLNET.EXPIRE_TIME,驗證空閒會話是否按時清理。# sqlnet.ora (服務端)
SQLNET.EXPIRE_TIME = 10
TRACE_LEVEL_SERVER = OFF # 生產關閉,排查時開啟 16
# 系統級 (Linux) /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
# sysctl -p 生效
| 方案 | 層級 | 優勢 | 局限 |
|---|---|---|---|
| DCD (SQLNET.EXPIRE_TIME) | SQL*Net | 感知會話邏輯狀態、可釋放 Oracle 級資源 | 依賴 TCP 重傳、延遲較大 |
| TCP Keepalive | OS 內核 | 無需 Oracle 配置、全連接生效 | 不感知 Oracle 會話、可能誤殺長查詢 |
| 應用層心跳 | 應用 | 精確控制、可攜帶業務狀態 | 需修改應用代碼、開發成本高 |
| DRCP / 連接池 | 中間件 | 連接復用、空閒自動回收、限制總連接數 | 需應用支援、遷移成本 |
建議採用「DCD + TCP Keepalive 雙重保險 + 連接池限流」分層防護體系,構建零僵死連接的高可用數據庫服務層。