當 Oracle 資料庫從單節點遷移至 RAC (Real Application Clusters) 叢集架構,原有 JDBC 連線字串與驅動程式可能失效。本文說明正確的連線字串格式、驅動程式版本對照表與遷移關鍵點。
| 驅動程式 JAR | JDK 1.4 | JDK 1.5 | JDK 1.6 | 單節點 | RAC 叢集 | Class.forName |
|---|---|---|---|---|---|---|
| OracleJdbcDriver9i.jar | ✓ | ✓ | ✓ | ✓ | ✗ | oracle.jdbc.OracleDriver |
| classes12.jar (9i) | ✓ | ✓ | ✓ | ✓ | ✗ | oracle.jdbc.OracleDriver |
| ojdbc14.jar (9i) | ✓ | ✓ | ✓ | ✓ | ✗ | oracle.jdbc.OracleDriver |
| classes12.jar (10g) | ✓ | ✓ | ✓ | ✓ | ✓ | oracle.jdbc.OracleDriver |
| ojdbc14.jar (10g) | ✓ | ✓ | ✓ | ✓ | ✓ | oracle.jdbc.OracleDriver |
| ojdbc5.jar | ✗ | ✓ | ✓ | ✓ | ✓ | 無需載入 (JDBC 4.0 SPI) |
| ojdbc6.jar | ✗ | ✗ | ✓ | ✓ | ✓ | 無需載入 (JDBC 4.0 SPI) |
建議:JDK 1.4 專案用 10g 版 classes12.jar 或 ojdbc14.jar;JDK 1.5+ 強烈推薦 ojdbc5/6.jar,支援 JDBC 3.0/4.0 新特性且無需 Class.forName。
StringBuffer url = new StringBuffer();
url.append("jdbc:oracle:thin:@(description= (address_list =");
url.append("(address=(protocol=tcp)(host=192.168.31.9)(port=1521))");
// 依節點數追加 address 項
// url.append("(address=(protocol=tcp)(host=10.37.27.112)(port=1521))");
url.append("(load_balance=yes)"); // 啟用負載平衡
url.append(")");
url.append("(connect_data =");
url.append("(server = dedicated)"); // 專用伺服器模式
url.append("(service_name=wangjj)"); // 服務名稱 (非 SID)
url.append("(failover_mode =");
url.append("(type=session)"); // 會話故障轉移
url.append("(method=basic)"); // 基本故障轉移 (preconnect 為預連接所有節點)
url.append("(retries=5)"); // 重試次數
url.append("(delay=15)"); // 重試間隔(秒)
url.append(")");
url.append(")");
url.append(")");
load_balance=yes:客戶端隨機選擇節點分散負載。type=session:現有會話自動切換至可用節點,進行中 SQL 需重新執行。method=basic:首次連接單一節點;preconnect 則預先連接所有節點,故障切換更快但資源消耗大。service_name 而非 sid,支援叢集服務註冊。完成驅動程式升級與 URL 重構後,應用即可無縫接入 Oracle RAC 環境。