getCharacterStream():Unicode 編碼 Reader,含中文必用此法。getAsciiStream():ASCII 編碼 InputStream。INSERT ... VALUES (EMPTY_CLOB()) 分配 Locator。SELECT ... FOR UPDATE 鎖定該列取得 Clob 物件。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 統一格式化。DataSource(J2EE 標準),而非硬編碼 DriverManager。maxActive、maxIdle、validationQuery 等參數。conn.setAutoCommit(true):無需手動 commit()。false:必須顯式 commit()/rollback()。JSP/Oracle 開發核心在於:CLOB 三步驟寫入、ISO-8859-1 編碼橋接、日期字串化交換、JNDI 連線池、事務邊界明確。掌握這五點可避開 90% 常見坑。