oracle.jdbc.OracleDriver (ojdbc8.jar/ojdbc11.jar)。jdbc:oracle:thin:@//host:port/service_name (推薦) 或 jdbc:oracle:thin:@host:port:sid。-Duser.timezone=GMT+8)、字符集 (NLS_LANG)、連接屬性 (oracle.net.CONNECT_TIMEOUT)。package com.util.db;
import java.sql.*;
public class OracleDbManager {
private static final String URL = "jdbc:oracle:thin:@//localhost:1521/ORCLCDB"; // 服務名模式
private static final String USER = "username";
private static final String PASSWORD = "password";
static {
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError("Oracle 驅動加載失敗: " + e.getMessage());
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
// === 統一關閉方法(與 MySQL 版完全一致) ===
public static void close(ResultSet rs) { /* 同前 */ }
public static void close(Statement stmt) { /* 同前 */ }
public static void close(PreparedStatement pstmt) { /* 同前 */ }
public static void close(ResultSet rs, Statement stmt, Connection conn) { /* 同前 */ }
public static void close(Statement stmt, Connection conn) { /* 同前 */ }
public static void close(Connection conn) { /* 同前 */ }
}
Properties props = new Properties();
props.setProperty("user", USER);
props.setProperty("password", PASSWORD);
props.setProperty("oracle.net.CONNECT_TIMEOUT", "5000"); // 連接超時 5s
props.setProperty("defaultRowPrefetch", "100"); // 預取行數減少網絡交互
props.setProperty("useFetchSizeWithLongColumn", "true"); // 優化大字段讀取
Connection conn = DriverManager.getConnection(URL, props);
CallableStatement cs = null;
try {
cs = conn.prepareCall("{call PKG_USER.GET_USER_INFO(?, ?, ?)}");
cs.setInt(1, userId); // IN 參數
cs.registerOutParameter(2, Types.VARCHAR); // OUT 參數
cs.registerOutParameter(3, Types.INTEGER);
cs.execute();
String name = cs.getString(2);
int level = cs.getInt(3);
} finally {
OracleDbManager.close(cs, conn);
}
| 問題 | 解決方案 |
|---|---|
| ORA-01805: 日期格式錯誤 | 設置會話時區 ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD' 或使用 PreparedStatement.setTimestamp |
| 中文亂碼 | 確保數據庫字符集為 AL32UTF8,JDBC URL 添加 ?characterEncoding=UTF-8 (thin 驅動通常自動處理) |
| 連接洩漏導致 ORA-00020 | 嚴格使用 try-with-resources 或 finally 關閉,生產環境強制連接池 |
| 大字段 (CLOB/BLOB) 讀寫 | 使用 clob.getCharacterStream() / blob.getBinaryStream() 流式處理 |
OracleDbManager 與 MySQL 版結構一致,核心差異在驅動、URL、特有優化屬性。建議項目中抽象出通用 DbManager 介面,屏蔽數據庫差異,便於多數據源切換。