客戶更換 Oracle 服務器後,運行兩年的應用頻現故障,需重啟服務恢復。工具連接正常,但數據讀取明顯變慢,懷疑連接池洩漏、慢 SQL 或網絡問題。無數據庫服務器權限,需從應用側排查。
持續觀測連接池狀態,建議每 30 秒記錄一次:
// 關鍵指標
ActiveConnections // 正在使用的連接
IdleConnections // 空閒連接
TotalConnections // 總連接數
WaitThreadCount // 等待連接的線程數
ConnectionLeakCount // 疑似洩漏連接(如 Druid 的 removeAbandoned)
異常模式:ActiveConnections 持續增長達到上限、IdleConnections 歸零、WaitThreadCount 飆升 → 連接洩漏或釋放不及時。
SQLException、timeout、Connection、pool、OracleORA-01000 (最大打開游標超過)、ORA-02396 (超過最大空閒時間)、ORA-12518 (監聽器無法啟動服務)雖無權限,但可要求 DBA 提供:
Top 5 Timed Events、SQL ordered by Elapsed Time、Wait EventsDB CPU、log file sync、db file sequential read、enq: TX - row lock contention# 基本連通性
ping -c 10 oracle-host
# 端口連通性
telnet oracle-host 1521
# 延遲抖動
mtr -r -c 100 oracle-host
# 吞吐測試
iperf3 -c oracle-host
-Doracle.net.tns_admin=/path/to/tnsnames.ora
-Djava.security.egd=file:/dev/./urandom
# Druid 監控
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 開啟連接洩漏檢測
spring.datasource.druid.remove-abandoned=true
spring.datasource.druid.remove-abandoned-timeout=180
spring.datasource.druid.log-abandoned=true
# 連接數統計
watch -n 5 'netstat -an | grep :1521 | awk '"'"'{print $6}'"'"' | sort | uniq -c'
# TCP 重傳率
netstat -s | grep -i retrans
# 內存/CPU 壓力
top -bn1 | head -20
| 根因 | 現象 | 對策 |
|---|---|---|
| 連接池洩漏 | Active 連接單調遞增,重啟暫時恢復 | 代碼審查關閉邏輯、開啟 removeAbandoned、升級連接池版本 |
| 慢 SQL 拖垮 | 讀取變慢、CPU 飆高、AWR 顯示高耗時 SQL | 優化 SQL、添加索引、調整執行計劃、分頁優化 |
| 數據庫資源瓶頸 | AWR 顯示 CPU/IO/鎖等待高 | DBA 優化參數、增加資源、SQL Profile |
| 網絡不穩/防火牆 | 間歇性斷連、ping 丟包、TCP 重傳高 | 網絡團隊排查、調整防火牆超時、啟用 TCP KeepAlive |
| Oracle 版本/參數不兼容 | 遷移後出現新錯誤碼 | 檢查兼容性矩陣、調整驅動版本、設置 oracle.net.CONNECT_TIMEOUT |
maxWait 避免線程無限阻塞testOnBorrow + validationQuery=SELECT 1 FROM DUALmaxActive 防止打爆數據庫會話限制核心原則:從應用側收集鐵證(連接池指標、異常堆棧、慢 SQL),協同 DBA 定位數據庫端根因,網絡排查為輔。無權限不代表無作為,完善的觀測體系是解決跨團隊故障的關鍵。