Java 開發者初次連線 Oracle 常遇到 ClassNotFoundException: oracle.jdbc.driver.OracleDriver 或 No suitable driver found。本文從驅動下載、Classpath 設定、Eclipse/IntelliJ/Maven/Gradle 專案整合、連線字串、連線池、模組化 (JPMS) 相容性,提供完整可複製貼上的解決方案。
ojdbc8.jar (JDK 8/11/17/21 通用)、ojdbc11.jar (JDK 11+ 專用、支援新特性)com.oracle.database.jdbc:ojdbc8 / ojdbc11)。<!-- Maven pom.xml -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>23.4.0.0</version>
</dependency>
// Gradle build.gradle
implementation 'com.oracle.database.jdbc:ojdbc11:23.4.0.0'
注意:Oracle JDBC 驅動在 Maven Central 發布需接受 OTN License,首次建置會提示互動確認,CI/CD 需設定 oracle.license.accept=true 系統屬性或使用 Oracle Maven Plugin。
ojdbc8.jar。ojdbc8.jar → Scope: Compile。.classpath 或 settings.json 的 java.project.referencedLibraries 加入 lib/ojdbc8.jar。# Windows CMD
set CLASSPATH=.;C:\oracle\jdbc\lib\ojdbc8.jar;%CLASSPATH%
# Linux/Bash
export CLASSPATH=.:/opt/oracle/jdbc/lib/ojdbc8.jar:$CLASSPATH
缺點:專案間相衝、版本難控、部署複雜。
// JDBC URL 格式
// 1. SID 格式 (舊版)
jdbc:oracle:thin:@host:port:SID
// 2. Service Name 格式 (推薦)
jdbc:oracle:thin:@//host:port/service_name
// 3. TNS 別名格式 (需 tnsnames.ora + oracle.net.tns_admin 系統屬性)
jdbc:oracle:thin:@tns_alias
// 完整範例
String url = "jdbc:oracle:thin:@//192.168.1.100:1521/ORCLPDB1";
String user = "app_user";
String pwd = "secure_password";
try (Connection conn = DriverManager.getConnection(url, user, pwd)) {
// 自動載入驅動 (JDBC 4.0+ SPI,無需 Class.forName)
try (PreparedStatement ps = conn.prepareStatement("SELECT SYSDATE FROM dual");
ResultSet rs = ps.executeQuery()) {
if (rs.next()) System.out.println("DB Time: " + rs.getTimestamp(1));
}
}
僅在需 Oracle Client 特定功能 (如 TAF、進階加密、外部程序) 時使用。需安裝 Instant Client、設定 LD_LIBRARY_PATH/PATH、URL 用 jdbc:oracle:oci:@。
// Maven
implementation 'com.zaxxer:HikariCP:5.0.1'
// 配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:oracle:thin:@//host:1521/service_name");
config.setUsername("app_user");
config.setPassword("pwd");
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
config.setConnectionTimeout(30000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);
config.addDataSourceProperty("oracle.net.CONNECT_TIMEOUT", "10000");
config.addDataSourceProperty("oracle.jdbc.ReadTimeout", "60000");
HikariDataSource ds = new HikariDataSource(config);
// Spring Boot: spring.datasource.hikari.* 對應上述屬性
| 主題 | 關鍵點 |
|---|---|
| 大物件 (LOB) | 用 PreparedStatement.setBlob/clob 或 OraclePreparedStatement.setBinaryStream/CharacterStream;讀取用 getBinaryStream/getCharacterStream 避免記憶體暴增。 |
| 批次更新 | ps.addBatch() + ps.executeBatch();Oracle 支援 setExecuteBatch(n) (舊) / 標準 JDBC 批次。 |
| 陣列繫結 | OraclePreparedStatement.setArray / createARRAY,大量資料高效寫入。 |
| 隱含連線 (Server-side) | 資料庫內部 Java (LoadJava) 用 defaultConnection() / KPRB Driver (jdbc:oracle:kprb:)。 |
| 模組化 (JPMS, Java 9+) | module-info.java 需 requires oracle.jdbc;;ojdbc11 為 Automatic Module,名稱 oracle.jdbc。 |
| 錯誤:No suitable driver | URL 拼寫錯誤、驅動未在 Classpath、JDK 版本不相容 (ojdbc8 需 JDK 8+)。 |
| 錯誤:ORA-28040 | 認證協定不匹配 (12c+ 預設 12C/11G,舊驅動不支援) → 升級驅動或 SEC_CASE_SENSITIVE_LOGON=FALSE (不建議)。 |
| 錯誤:IO Exception: The Network Adapter could not establish the connection | 主機/埠/防火牆/Listener 未啟動/Service Name 錯誤 → tnsping、lsnrctl status 驗證。 |
ojdbc8/11.jar 在 Classpath/依賴中//host:port/service_name 格式READY (lsnrctl status)遵循「Maven 管理依賴 → Thin Driver + Service Name URL → HikariCP 連線池 → 標準 JDBC API」這條主流路徑,能避開 90% 的連線問題,專注於業務開發。