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

JSP 連接 Oracle 實戰精華:CLOB/BLOB 處理、編碼轉換、日期、連線池

     編輯:Oracle 資料庫相關知識

一、CLOB/BLOB 大物件處理

CLOB 讀取

  • getCharacterStream():Unicode 編碼 Reader,含中文必用此法。
  • getAsciiStream():ASCII 編碼 InputStream。

寫入流程(必須三步驟)

  1. INSERT ... VALUES (EMPTY_CLOB()) 分配 Locator。
  2. SELECT ... FOR UPDATE 鎖定該列取得 Clob 物件。
  3. 透過 Clob.setCharacterStream() 寫入內容,再 UPDATE 送回。
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(
  "INSERT INTO test(id, content) VALUES (?, EMPTY_CLOB())");
ps.setInt(1, id); ps.executeUpdate();

ps = conn.prepareStatement("SELECT content FROM test WHERE id=? FOR UPDATE");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
  Clob clob = rs.getClob(1);
  Writer w = clob.setCharacterStream(1);
  w.write("中文內容...");
  w.close();
  conn.commit();
}

關鍵點:FOR UPDATE 鎖定、setAutoCommit(false) 避免「違反讀取順序」錯誤。

二、中文編碼轉換工具類

public class ECov {
  public static String asc2gb(String asc) {  // DB → Java
    if (asc == null) return null;
    try { return new String(asc.getBytes("ISO8859_1"), "GB2312"); }
    catch (Exception e) { return asc; }
  }
  public static String gb2asc(String gb) {   // Java → DB
    if (gb == null) return null;
    try { return new String(gb.getBytes("GB2312"), "ISO8859_1"); }
    catch (Exception e) { return gb; }
  }
}

使用:寫入前 ECov.gb2asc(str),讀出後 ECov.asc2gb(str)。核心假設:Oracle JDBC 驅動預設以 ISO-8859-1 傳輸。

三、日期類型處理

  • 不直接用 setDate/getDate,建議以 TIMESTAMP 或字串 TO_DATE('yyyy-mm-dd','YYYY-MM-DD') 交換。
  • 利用 SimpleDateFormat 統一格式化。

四、連線池最佳實務

  • 採用 JNDI 查找 DataSource(J2EE 標準),而非硬編碼 DriverManager。
  • 配置 maxActive、maxIdle、validationQuery 等參數。

五、自動提交控制

  • conn.setAutoCommit(true):無需手動 commit()。
  • false:必須顯式 commit()/rollback()。

小結

JSP/Oracle 開發核心在於:CLOB 三步驟寫入、ISO-8859-1 編碼橋接、日期字串化交換、JNDI 連線池、事務邊界明確。掌握這五點可避開 90% 常見坑。

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