Oracle 是企業級 Java Web 開發最常用的數據庫之一。本文聚焦 JBuilder / Eclipse / IDEA 等 IDE 環境下配置 Oracle JDBC 驅動、連接 URL 構建、常見異常排查,並提供可直接運行的 JDBC 核心代碼。
| Oracle 版本 | 推薦驅動 JAR | 備註 |
|---|---|---|
| 8i / 9i / 10g / 11g | ojdbc14.jar (JDK 1.4/5) / ojdbc5.jar (JDK 5/6) / ojdbc6.jar (JDK 6/7/8) | 舊版專用 |
| 12c / 18c / 19c / 21c | ojdbc8.jar (JDK 8/11) / ojdbc10.jar (JDK 10/11) / ojdbc11.jar (JDK 11+) | 現代首選 |
配置要點:
WEB-INF/lib(Web 應用)或 IDE 全局庫。CLASSPATH 非必需,但建議加入以便命令行測試。Enterprise Setup → Configure Libraries 添加 JAR 路徑;Database Pilot 中驅動圖標變黑表示加載成功。// Thin 模式(純 Java,無需客戶端,最常用)
jdbc:oracle:thin:@::
// 例子
jdbc:oracle:thin:@127.0.0.1:1521:ORCL
// Service Name 模式(支援 RAC/PDB)
jdbc:oracle:thin:@//:/
// 例子
jdbc:oracle:thin:@//192.168.1.100:1521/PDB1
// OCI 模式(需安裝 Oracle Client,性能略優但部署複雜)
jdbc:oracle:oci:@
import java.sql.*;
public class OracleJdbcDemo {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
String user = "scott";
String pwd = "tiger";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT empno, ename, job, hiredate FROM emp")) {
// 1. 註冊驅動 (JDBC 4.0+ 可省略 Class.forName)
// Class.forName("oracle.jdbc.OracleDriver");
System.out.println("工號\t姓名\t職位\t入職日期");
while (rs.next()) {
System.out.printf("%s\t%s\t%s\t%s%n",
rs.getString("empno"),
rs.getString("ename"),
rs.getString("job"),
rs.getDate("hiredate"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
| 異常/現象 | 原因 | 解決 |
|---|---|---|
ClassNotFoundException: oracle.jdbc.OracleDriver | 驅動 JAR 未在類路徑 | 檢查 WEB-INF/lib / IDE 庫 / CLASSPATH |
IO異常: The Network Adapter could not establish the connection | IP/端口/SID 錯誤、防火牆、監聽未啟動 | sqlplus 測試連通性;檢查 listener.ora、tnsnames.ora |
java.sql.SQLException: IO異常,不在流模式下 | 操作 LOB (BLOB/CLOB) 時用了普通 Statement | 用 OracleStatement / oracle.sql.BLOB API;或升級驅動 |
setAutoCommit 失敗 | 連接已關閉或池中連接失效 | 關閉舊連接重新獲取;配置連接池驗證查詢 (SELECT 1 FROM DUAL) |
| WebLogic 連接池報「無可用連接」但 DB 空閒 | 後台 exp 導出同義詞用戶導致進程僵死 (Oracle 9i/10g Bug) | 殺掉 exp 進程、重啟 DB、禁止導出同義詞用戶 |
<Resource name="jdbc/OracleDS"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
username="scott"
password="tiger"
maxTotal="20"
maxIdle="10"
maxWaitMillis="-1"
validationQuery="SELECT 1 FROM DUAL"
testOnBorrow="true"/>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/OracleDS");
try (Connection conn = ds.getConnection()) {
// 業務邏輯
}
%>
ORACLE_XA;xaosw;%ORACLE_HOME%\bin\oraxa12.lib %ORACLE_HOME%\precomp\lib\orasql12.lib (分號分隔,同一行)ORACLE_HOME 環境變量,請寫絕對路徑。