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

Java JDBC 連接 Oracle 11g R2 完整配置指南

     編輯:Java 相關知識

解決 Oracle 11g R2 JDBC 連接「ORA-12505」錯誤:正確的連接字串與驅動配置

Oracle 11g Release 2 引入了新的連接語法,傳統的 SID 模式連接字串會導致 ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 錯誤。本文詳細說明正確的連接方式、驅動選擇、連接池配置與常見問題排查。

錯誤根因

Oracle 11g R2 監聽器默認註冊服務名而非 SID。舊式連接字串使用 :SID 語法,監聽器無法識別。

正確的連接字串對比

模式語法適用版本示例
服務名 (推薦)jdbc:oracle:thin:@//host:port/service_name11g R2+jdbc:oracle:thin:@//192.168.1.100:1521/ORCL
SID (舊式)jdbc:oracle:thin:@host:port:SID11g R1 及之前jdbc:oracle:thin:@192.168.1.100:1521:ORCL
TNSNAMESjdbc:oracle:thin:@tns_alias所有版本需配置 tnsnames.ora 並設 TNS_ADMIN

關鍵差異:服務名模式使用雙斜槓 // 和單斜槓 / 分隔服務名,而非冒號 :。

完整連接代碼範例

import java.sql.*;

public class Oracle11gJdbcDemo {
    // 配置常量(實際項目請外部化配置)
    private static final String DRIVER = "oracle.jdbc.OracleDriver"; // 11g+ 統一驅動類名
    private static final String URL = "jdbc:oracle:thin:@//localhost:1521/ORCL"; // 服務名模式
    private static final String USER = "scott";
    private static final String PASSWORD = "tiger";

    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 1. 加載驅動 (JDBC 4.0+ 可省略,但建議保留兼容舊容器)
            Class.forName(DRIVER);
            
            // 2. 建立連接
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            System.out.println("連接成功!數據庫版本: " + conn.getMetaData().getDatabaseProductVersion());
            
            // 3. 執行查詢
            stmt = conn.createStatement();
            String sql = "SELECT * FROM EMP WHERE ROWNUM <= 5";
            rs = stmt.executeQuery(sql);
            
            // 4. 處理結果
            while (rs.next()) {
                System.out.printf("EMPNO: %d, ENAME: %s, JOB: %s, SAL: %.2f%n",
                    rs.getInt("EMPNO"),
                    rs.getString("ENAME"),
                    rs.getString("JOB"),
                    rs.getDouble("SAL"));
            }
            
        } catch (ClassNotFoundException e) {
            System.err.println("驅動類未找到,請檢查 ojdbc*.jar 是否在 classpath 中");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("SQL 執行錯誤: " + e.getMessage());
            System.err.println("SQLState: " + e.getSQLState());
            System.err.println("ErrorCode: " + e.getErrorCode()); // ORA-錯誤碼
            e.printStackTrace();
        } finally {
            // 5. 關鍵:逆序關閉資源
            closeQuietly(rs);
            closeQuietly(stmt);
            closeQuietly(conn);
        }
    }

    private static void closeQuietly(AutoCloseable resource) {
        if (resource != null) {
            try { resource.close(); } catch (Exception ignored) {}
        }
    }
}

驅動 JAR 選擇指南

JAR 文件JDK 版本Oracle 版本備註
ojdbc8.jarJDK 8+12c, 18c, 19c, 21c推薦新項目使用
ojdbc7.jarJDK 7/811g R2, 12c R111g R2 專用
ojdbc6.jarJDK 6/711g R1/R2舊項目維護

下載地址:Oracle 官網 JDBC/UCP 下載頁(需 Oracle 帳號)。

生產環境必備:連接池配置 (HikariCP 為例)

// application.properties / yml
spring.datasource.url=jdbc:oracle:thin:@//db-host:1521/ORCL
spring.datasource.username=app_user
spring.datasource.password=secure_pass
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

# HikariCP 核心參數
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL
spring.datasource.hikari.pool-name=OracleHikariPool

常見錯誤碼速查表

錯誤碼含義解決方向
ORA-12505監聽器不知 SID改用服務名語法 @//host:port/service
ORA-12514監聽器不知服務檢查服務名拼寫、數據庫實例是否註冊到監聽器
ORA-01017用戶名/密碼錯誤檢查大小寫、鎖定狀態、密碼過期
ORA-12170連接超時檢查防火牆、VPN、主機名解析、監聽器端口
ORA-28000帳號鎖定DBA 解鎖 ALTER USER user ACCOUNT UNLOCK

進階優化技巧

  • 獲取元數據優化:設置 connection.setClientInfo("OCSID.APP_CONTEXT", "value") 減少圍繞查詢
  • 隱式連接緩存:Oracle 驅動支援 oracle.jdbc.implicitConnectionCache=true
  • 批量操作:stmt.addBatch() + executeBatch() 大幅提升寫入效能
  • 游標預取:stmt.setFetchSize(100) 減少網絡往返
  • ONS 事件驅動:配合 RAC 使用 Fast Connection Failover (FCF)

遷移至 Oracle 19c/21c 注意事項

  • 驅動升級至 ojdbc8.jar 或 ojdbc11.jar (JDK 11+)
  • 服務名語法完全兼容,無需修改連接字串
  • 啟用 oracle.jdbc.fanEnabled=true 獲得計劃性維護通知
  • 考慮使用 Universal Connection Pool (UCP) 替換 HikariCP 獲得更深度 Oracle 整合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved