首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Java + Oracle 應用開發三大常見問題與解決方案

     編輯:Oracle 資料庫相關知識

本文針對 JDBC 驅動載入、大物件 (LOB) 儲存、可捲動結果集三大經典議題,提供最佳實務與避坑指南。

問題一:JDBC 驅動載入的三種方式

方式程式碼優缺點
1. Class.forNameClass.forName("oracle.jdbc.driver.OracleDriver")簡單,但 MS JVM (IE Applet) 無法正確初始化靜態區塊
2. 系統屬性檔System.getProperties().load(new FileInputStream("jdbc.properties"))
檔案內:jdbc.driver=oracle.jdbc.driver.OracleDriver
可同時載入多驅動,切換資料庫無需改代碼,彈性佳
3. 直接註冊DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver())最可靠,任何環境皆適用,但彈性較差

建議:Applet 環境用方式 3;一般應用綜合考量彈性與可靠性選擇。

問題二:大物件 (BLOB/CLOB) 儲存正確姿勢

錯誤迷思

網路 99% 教學錯誤,甚至 Sun 官方文件也有小錯誤。JDBC 2.0 無法直接對 BLOB 寫入二進位資料,嘗試會拋出 IO Exception 而非 SQL Exception。

方案 A:使用 LONG RAW(標準 JDBC)

CREATE TABLE tb_file (name VARCHAR2(20), detail LONG RAW);

File file = new File("aaa.gif");
int len = (int) file.length();
InputStream fin = new FileInputStream(file);
PreparedStatement pstmt = con.prepareStatement("INSERT INTO tb_file VALUES ('aaa.gif', ?)");
pstmt.setBinaryStream(1, fin, len);
pstmt.executeUpdate();

方案 B:使用 BLOB(需 Oracle 專有 API)

CREATE TABLE tb_file (name VARCHAR2(20), detail BLOB);

con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT INTO tb_file VALUES ('aaa.gif', EMPTY_BLOB())");

// 必須 SELECT FOR UPDATE 取得 BLOB 定位器
ResultSet rs = stmt.executeQuery("SELECT detail FROM tb_file WHERE name='aaa.gif' FOR UPDATE");
if (rs.next()) {
    BLOB blob = rs.getBlob(1);
    OutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream();
    byte[] buf = new byte[blob.getBufferSize()];
    InputStream fin = new FileInputStream(file);
    int read;
    while ((read = fin.read(buf)) != -1) out.write(buf, 0, read);
    fin.close(); out.close(); con.commit();
}

讀取 BLOB 同樣需 blob.getBinaryStream(),不可用 rs.getBinaryStream()。

問題三:可捲動結果集陷阱

  • Oracle 不支援伺服器端可捲動游標;JDBC 驅動程式在記憶體中全量快取來模擬。
  • 大量資料查詢會導致記憶體耗盡(OOM),絕不可用於大結果集。
  • 若需分頁,請使用 ROWNUM、分析函數或 Oracle 12c+ 的 OFFSET ... FETCH。

掌握這三大議題,能避開 Java-Oracle 開發中最常見的效能與穩定性地雷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved