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

Oracle 環境下開發 Java 程式常見問題探討

     編輯:Oracle 資料庫基礎

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

正常載入驅動程式有三種途徑:

  1. Class.forName(String):相當於 ClassLoader 載入指定類別,載入時初始化驅動程式靜態內容,實際上呼叫了 DriverManager.registerDriver(driver)。
  2. 系統屬性檔:System.getProperties().load(new FileInputStream("屬性檔")),屬性檔中指定 jdbc.driver=drivername。優點:可同時載入多個 JDBC,換資料庫時不用修改 Java 原始碼,只需修改屬性檔。
  3. 直接 registerDriver(driver):最可靠,任何環境下均可使用。

注意:方法 1 簡單但 MS JVM 無法正確初始化(如 IE 中 Applet 不可用),應用方法 3。但方法 3 彈性不如方法 2,可根據環境綜合考量。

問題二:大物件(LOB)儲存

大物件儲存通常指將檔案存入資料庫,當然也可為記憶體中超大字串。對圖片等二進位檔案應用二進位儲存。網路上 99% 教學不可行,連 Sun 官方文件也有錯誤。

誤區:JDBC 2.0 無法直接對 BLOB 存入二進位檔案

若嘗試直接存入 BLOB,會得到 IO 而非 SQL 例外。

方案一:使用 LONG RAW 型別(標準 JDBC)

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

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

方案二:使用 BLOB 型別(需 Oracle 專有方法)

CREATE TABLE tb_file(name VARCHAR(20), detail BLOB);
con.setAutoCommit(false);
stmt.executeUpdate("INSERT INTO tb_file VALUES('aaa.gif', EMPTY_BLOB())");

// 必須 SELECT 取得 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[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize()];
  InputStream fin = new FileInputStream(file);
  int len;
  while ((len = fin.read(b)) != -1) out.write(b, 0, len);
  fin.close(); out.close(); con.commit();
}

讀取時也不能像 LONG RAW 那樣用 rs.getBinaryStream("detail"),必須:

Blob blob = rs.getBlob("detail");
InputStream in = blob.getBinaryStream();

問題三:可捲動結果集

Oracle 明確說明不支援結果集捲動,JDBC 2 取得的可捲動結果集是 JDBC 自己在記憶體中高度快取,許多開發者誤以為是資料庫支援。若真查詢大量資料列,記憶體會耗盡。對超大量資料,寧願用笨方法也不要用可捲動結果集。

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