首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 下 Java 開發三大核心問題深度解析:JDBC 載入、大物件存儲、可捲動游標

     編輯:Oracle 資料庫基礎

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

  1. Class.forName("oracle.jdbc.driver.OracleDriver"):最常用,靜態區塊自動向 DriverManager 註冊。但 Microsoft JVM(如 IE Applet)無法正確初始化。
  2. 系統屬性檔:jdbc.drivers=oracle.jdbc.driver.OracleDriver,啟動時 java -Djdbc.drivers=... 或程式中 System.getProperties().load(...)。優點:換資料庫不改代碼,支援多驅動並載。
  3. DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()):最可靠,任何環境(含 Applet、Servlet)皆適用,缺點:寫死驅動類別,靈活性較低。

建議:一般應用用 1;Applet/特殊環境用 3;需動態切換資料庫用 2。

問題二:大物件(BLOB/CLOB)存儲陷阱

標準 JDBC 2.0 不支援直接向 BLOB 寫入二進位流,嘗試會拋出 IO 錯誤而非 SQL 錯誤,極易誤判。

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

CREATE TABLE TB_FILE (NAME VARCHAR(20), DETAIL LONG RAW);

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

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

CREATE TABLE TB_FILE (NAME VARCHAR(20), DETAIL BLOB);

con.setAutoCommit(false);
stmt.executeUpdate("INSERT INTO TB_FILE VALUES('aaa.gif', EMPTY_BLOB())");

ResultSet rs = stmt.executeQuery("SELECT DETAIL FROM TB_FILE WHERE NAME='aaa.gif' FOR UPDATE");
if (rs.next()) {
  oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob(1);
  OutputStream out = blob.getBinaryOutputStream();
  byte[] buf = new byte[blob.getBufferSize()];
  InputStream fin = new FileInputStream(file);
  int len;
  while ((len = fin.read(buf)) != -1) out.write(buf, 0, len);
  fin.close(); out.close();
  con.commit();
}

讀取時:Blob blob = rs.getBlob("DETAIL"); InputStream in = blob.getBinaryStream();,不可用 rs.getBinaryStream("DETAIL")。

問題三:可捲動結果集誤區

  • Oracle 明確不支援伺服器端捲動游標。
  • JDBC 2.0 ResultSet.TYPE_SCROLL_INSENSITIVE 是由驅動程式在客戶端記憶體完整緩存結果集模擬出來的。
  • 大量資料(百萬列以上)會耗盡客戶端記憶體導致 OOM 或效能崩潰。
  • 建議:大資料量情境下,寧可用分頁查詢(ROWNUM)或游標分批取回,勿使用可捲動結果集。

結語

這三個問題在網路教學文中錯誤率極高,甚至官方文件也有誤導。實作驗證才是唯一標準,切勿盲目複製貼上。

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