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

JDBC 連接 Oracle 數據庫完整指南(含連接池最佳實踐)

     編輯:Java 相關知識

JDBC 連接 Oracle 基礎步驟

使用 JDBC 連接 Oracle 數據庫主要分為四步:加載驅動、建立連接、執行 SQL、釋放資源。現代應用建議配合連接池(HikariCP、Druid)使用,避免頻繁創建銷毀連接的性能開銷。

Maven 依賴坐標

<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc11</artifactId>
    <version>23.4.0.0</version>
</dependency>

注意:Oracle 19c/21c/23c 建議使用 ojdbc11(支援 JDK 11+),舊版 ojdbc8 僅支援 JDK 8。驅動類名統一為 oracle.jdbc.OracleDriver。

連接 URL 格式詳解

格式適用場景範例
Thin 驅動(純 Java) 最常用,無需 Oracle Client jdbc:oracle:thin:@//host:port/service_name
SID 模式(舊版) 兼容老系統 jdbc:oracle:thin:@host:port:SID
TNS 名稱 配置 tnsnames.ora jdbc:oracle:thin:@TNS_ALIAS
LDAP/OID 企業級統一目錄 jdbc:oracle:thin:@ldap://host:port/dn,cn=OracleContext

標準 JDBC 代碼範例(手動資源管理)

public void queryUsers() {
    String url = "jdbc:oracle:thin:@//localhost:1521/ORCLPDB1";
    String user = "system";
    String password = "your_password";
    
    String sql = "SELECT user_id, username FROM users WHERE status = ?";
    
    try (Connection conn = DriverManager.getConnection(url, user, password);
         PreparedStatement ps = conn.prepareStatement(sql)) {
        
        ps.setInt(1, 1); // 設置參數,防止 SQL 注入
        
        try (ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                long id = rs.getLong("user_id");
                String name = rs.getString("username");
                System.out.printf("ID: %d, Name: %s%n", id, name);
            }
        }
    } catch (SQLException e) {
        // 統一異常處理,記錄錯誤碼與 SQLState
        System.err.printf("SQL Error: %d, State: %s, Msg: %s%n", 
            e.getErrorCode(), e.getSQLState(), e.getMessage());
        throw new RuntimeException("數據庫查詢失敗", e);
    }
}

生產環境必備:HikariCP 連接池配置

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@//localhost:1521/ORCLPDB1");
config.setUsername("system");
config.setPassword("your_password");
config.setDriverClassName("oracle.jdbc.OracleDriver");

// 核心池參數調優
config.setMaximumPoolSize(20);           // 最大連接數
config.setMinimumIdle(5);                // 最小空閒連接
config.setIdleTimeout(300000);           // 空閒超時 5 分鐘
config.setMaxLifetime(1800000);          // 連接最大壽命 30 分鐘
config.setConnectionTimeout(30000);      // 獲取連接超時 30 秒
config.setLeakDetectionThreshold(60000); // 洩漏檢測 60 秒

// Oracle 專項優化
config.addDataSourceProperty("oracle.net.CONNECT_TIMEOUT", "10000");
config.addDataSourceProperty("oracle.jdbc.ReadTimeout", "60000");
config.setPoolName("Oracle-HikariCP-Pool");

HikariDataSource dataSource = new HikariDataSource(config);

// 使用連接池
try (Connection conn = dataSource.getConnection()) {
    // 業務邏輯...
}

常見問題排查

  1. ORA-12505 / ORA-12514:SID/Service Name 錯誤,確認 lsnrctl status 監聽器註冊的服務名。
  2. ORA-28040:認證協議不匹配,Oracle 12c+ 預設關閉舊版認證,需在 sqlnet.ora 設置 SQLNET.ALLOWED_LOGON_VERSION_SERVER=11 或升級驅動。
  3. 時區不一致:JVM 與 DB 時區不同導致 TIMESTAMP WITH TIME ZONE 偏移,啟動參數加 -Duser.timezone=Asia/Shanghai 或連接屬性 oracle.jdbc.timezoneAsRegion=false。
  4. 大字段(CLOB/BLOB)讀寫:需在事務中操作,使用 ResultSet.getClob() / getBlob() 獲取流式讀寫。

最佳實踐清單

  • ✅ 統一使用 PreparedStatement 防注入、利用執行計劃緩存。
  • ✅ 必須使用 try-with-resources 自動關閉 Connection/Statement/ResultSet。
  • ✅ 生產環境強制使用連接池,禁用 DriverManager.getConnection。
  • ✅ 配置連接驗證查詢 SELECT 1 FROM DUAL 防止防火牆斷開空閒連接。
  • ✅ 監控連接池指標(使用率、等待時間、洩漏),設置告警閾值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved