首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

應用服務器與 Oracle 數據庫連接異常排查全攻略

     編輯:程式設計綜合問答

問題背景

客戶更換 Oracle 服務器後,運行兩年的應用頻現故障,需重啟服務恢復。工具連接正常,但數據讀取明顯變慢,懷疑連接池洩漏、慢 SQL 或網絡問題。無數據庫服務器權限,需從應用側排查。

系統排查四步法

1. 連接池監控(核心)

持續觀測連接池狀態,建議每 30 秒記錄一次:

// 關鍵指標
ActiveConnections   // 正在使用的連接
IdleConnections     // 空閒連接
TotalConnections    // 總連接數
WaitThreadCount     // 等待連接的線程數
ConnectionLeakCount // 疑似洩漏連接(如 Druid 的 removeAbandoned)

異常模式:ActiveConnections 持續增長達到上限、IdleConnections 歸零、WaitThreadCount 飆升 → 連接洩漏或釋放不及時。

2. 應用日志異常分析

  • 搜索關鍵字:SQLException、timeout、Connection、pool、Oracle
  • 重點關注:ORA-01000 (最大打開游標超過)、ORA-02396 (超過最大空閒時間)、ORA-12518 (監聽器無法啟動服務)
  • 配置慢 SQL 日志閾值(如 > 1s),定位性能殺手

3. 協同 DBA 獲取 AWR 報告

雖無權限,但可要求 DBA 提供:

  • AWR 報告:關注 Top 5 Timed Events、SQL ordered by Elapsed Time、Wait Events
  • ASH 報告:針對故障時間窗口的活動會話歷史
  • 關鍵指標:DB CPU、log file sync、db file sequential read、enq: TX - row lock contention

4. 網絡基礎排查

# 基本連通性
ping -c 10 oracle-host
# 端口連通性
telnet oracle-host 1521
# 延遲抖動
mtr -r -c 100 oracle-host
# 吞吐測試
iperf3 -c oracle-host

進階排查工具與腳本

Java 端連接洩漏檢測

-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

Linux 系統層面觀測

# 連接數統計
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

應急預案

  1. 配置連接池 maxWait 避免線程無限阻塞
  2. 啟用 testOnBorrow + validationQuery=SELECT 1 FROM DUAL
  3. 設置合理 maxActive 防止打爆數據庫會話限制
  4. 準備重啟腳本,減少恢復時間

核心原則:從應用側收集鐵證(連接池指標、異常堆棧、慢 SQL),協同 DBA 定位數據庫端根因,網絡排查為輔。無權限不代表無作為,完善的觀測體系是解決跨團隊故障的關鍵。

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