| 項目 | 快速機器 | 緩慢機器 |
| JDK 版本 | 1.5.0_14 | 1.5.0 (無更新版本號) |
| JRE 版本 | 1.5.0_14 | 1.5.0 |
技術根因分析
JDK 1.5.0 初始版本 (GA) 存在已知缺陷:
- DNS 反向解析阻塞:Socket 建立時嘗試反向解析 DB Server 主機名,無 DNS 時長時間阻塞
- SSL/TLS 協商缺陷:即使非加密連線,早期 JSSE 實作仍嘗試協商
- Oracle JDBC Thin 驅動交互:ojdbc14 在 JDK 1.5.0 GA 上的 SecureRandom 種子產生極慢
JDK 1.5.0_06 起修復 DNS 快取問題,_14 進一步優化 SecureRandom 與網路堆疊。
解決方案
方法一:升級 JDK(推薦)
# 1. 下載 JDK 1.5.0_14 或更新版本 (建議 1.6.0_45+ / 1.7.0_80+ / 1.8.0_200+)
# 2. 安裝至新目錄,避免覆蓋系統共用 JDK
# 3. 修改開發工具/應用伺服器啟動腳本指向新 JAVA_HOME
# 4. 重啟應用驗證
# Tomcat 範例 (catalina.sh/setenv.sh)
export JAVA_HOME=/usr/java/jdk1.5.0_14
export PATH=$JAVA_HOME/bin:$PATH
方法二:JVM 參數繞過 (不升級 JDK 時)
# 禁用 DNS 反向解析
-Dsun.net.spi.nameservice.provider.1=dns,sun
-Dsun.net.inetaddr.ttl=0
-Djava.net.preferIPv4Stack=true
# 修正 SecureRandom 熵源阻塞 (Linux/Unix)
-Djava.security.egd=file:/dev/./urandom
# 完整啟動參數範例
JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom -Dsun.net.inetaddr.ttl=0 -Djava.net.preferIPv4Stack=true"
方法三:JDBC 連線字串優化
# 使用 IP 而非主機名,避免 DNS 解析
jdbc:oracle:thin:@192.168.1.100:1521:ORCL
# 停用 SSL (若非加密連線)
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))
驗證結果
- 升級至 JDK 1.5.0_14 後,連線時間從 30+ 秒降至 <500ms
- 所有 4 台機器行為一致
- 無程式碼變更,純環境層面修復
深度補充:為何同版本號行為不同?
JDK 版本號格式:1.5.0 = GA 版 (General Availability,首發版),1.5.0_14 = Update 14 (含 14 次安全性/修正更新)。Oracle JDK 更新版本僅修改尾碼,主版本號不變,極易被忽略。
最佳實踐建議
- 鎖定 JDK 版本:專案明確指定
JAVA_HOME,不依賴系統預設
- 基線映像:開發/測試/生產使用相同 JDK 建置映像
- 定期更新:關注 Oracle CPU (Critical Patch Update) 發布
- 診斷工具:
jstack 檢查阻塞堆疊、strace -p 追蹤系統呼叫
- 連線池配置:DBCP/HikariCP 設定
connectionTimeout、validationQuery
結語:看似網路/資料庫/驅動問題,實為 JDK 微版本缺陷。養成「版本號看到尾碼」的習慣,能避開無數隱形坑。
- 上一篇文章: Linux AS4 上安裝 Oracle 9.2.0.4 完整實戰筆記(含 VMware 環境)
- 下一篇文章: Debian 4.0 安裝 Oracle 10g XE 實戰筆記:輕量級資料庫部署指南
Copyright ©
程式碼之家 All Rights Reserved