首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 連線 Oracle 資料庫:JDBC Thin Driver 三種 URL 格式完整解析

     編輯:Java 相關知識

Oracle JDBC 驅動程式三大類型

驅動類型全名特點適用場景
JDBC OCI Oracle Call Interface 需安裝 Oracle Client,依賴 Native Library (DLL/so) 傳統桌面應用、需高效能的本地連線
JDBC Thin Pure Java Driver 純 Java 實作,透過 Socket 通訊,無需 Client 安裝 Web 應用、跨平台部署、容器化環境
JDBC KPRB Server-side Internal Driver 運行於資料庫內部 (Stored Procedure/Trigger),使用預設 Session 資料庫內部 Java 程式

JDBC Thin Driver 三種連線 URL 格式

格式一:Service Name (推薦,支援 RAC 叢集)

jdbc:oracle:thin:@//<host>:<port>/<service_name>
範例:jdbc:oracle:thin:@//192.168.2.1:1521/XE

關鍵特徵:@ 後有雙斜線 //。Service Name 可涵蓋叢集所有節點,是 Oracle 官方推薦格式。

格式二:SID (傳統格式,已漸淘汰)

jdbc:oracle:thin:@<host>:<port>:<SID>
範例:jdbc:oracle:thin:@192.168.2.1:1521:X01A

注意:Oracle 建議遷移至 Service Name。每個節點 SID 不同,不利叢集環境。

格式三:TNS Name (需額外配置)

jdbc:oracle:thin:@<TNSName>
範例:jdbc:oracle:thin:@GL

前提:JVM 需設定 oracle.net.tns_admin 系統屬性指向 tnsnames.ora 所在目錄。

實戰測試與常見問題排解

環境準備

  • Oracle 11g R2
  • listener.ora 靜態註冊:GLOBAL_DBNAME=dave、SID_NAME=NEWCCS
  • tnsnames.ora:SERVICE_NAME=dave

測試 1:使用 SID 連線

String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:NEWCCS";
// 成功連線,可查詢資料

測試 2:使用 Service Name 連線

String dbUrl = "jdbc:oracle:thin:@//127.0.0.1:1521/dave";
// 成功連線,推薦用法

常見錯誤:The Network Adapter could not establish the connection

原因:Oracle 11g JDBC Thin Driver 版本相容性問題。

解決:將驅動類別從 oracle.jdbc.driver.OracleDriver 改為 oracle.jdbc.OracleDriver。

測試 3:使用 TNS Name 連線

String dbUrl = "jdbc:oracle:thin:@DVD";
// 錯誤:java.sql.SQLException: Unknown host specified

解決方案一:啟動 JVM 時添加參數

-Doracle.net.tns_admin=D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN

解決方案二:程式碼中設定

System.setProperty("oracle.net.tns_admin", 
    "D:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\NETWORK\\ADMIN");

完整連線範例程式碼

package com.example.jdbc;

import java.sql.*;

public class OracleJdbcConnectionTest {
    public static void main(String[] args) {
        try {
            // 1. 載入驅動 (建議使用新版類別名)
            Class.forName("oracle.jdbc.OracleDriver");

            // 2. 連線字串 (Service Name 格式)
            String url = "jdbc:oracle:thin:@//localhost:1521/XE";
            String user = "scott";
            String password = "tiger";

            // 3. 建立連線
            try (Connection conn = DriverManager.getConnection(url, user, password);
                 Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT ename FROM emp")) {

                // 4. 處理結果
                while (rs.next()) {
                    System.out.println(rs.getString("ename"));
                }
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}

最佳實踐總結

  1. 優先使用 Service Name 格式,支援 RAC 高可用
  2. 使用 oracle.jdbc.OracleDriver 避免 11g 連線問題
  3. 善用 try-with-resources 自動關閉資源
  4. 生產環境建議使用連線池 (HikariCP、Druid 等)
  5. TNS Name 方式需正確設定 tns_admin,適合已有完整 Oracle Client 環境
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved