Clob clob = rs.getClob("content");
Reader reader = clob.getCharacterStream(); // 支援中文
BufferedReader br = new BufferedReader(reader);
String line, content = "";
while ((line = br.readLine()) != null) content += line + "\n";
br.close();
INSERT ... VALUES (..., empty_clob()) 分配 Locator。SELECT ... FOR UPDATE 鎖定該列,取得 Clob 物件。Writer w = clob.setCharacterStream(1L); w.write(text); w.close();UPDATE ... SET content = ? WHERE ... 寫回(或同一交易自動生效)。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", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
Clob clob = rs.getClob(1);
Writer w = clob.setCharacterStream(1L);
w.write("大量中文內容...");
w.close();
}
conn.commit();
關鍵:FOR UPDATE 鎖列、setAutoCommit(false) 避免「違反讀取順序」錯誤。
public class ECov {
// 資料庫讀出 (ISO-8859-1 → GB2312)
public static String asc2gb(String s) {
if (s==null) return s;
try { return new String(s.getBytes("ISO8859_1"), "GB2312"); }
catch (UnsupportedEncodingException e) { return s; }
}
// 寫入資料庫 (GB2312 → ISO-8859-1)
public static String gb2asc(String s) {
if (s==null) return s;
try { return new String(s.getBytes("GB2312"), "ISO8859_1"); }
catch (UnsupportedEncodingException e) { return s; }
}
}
使用:ECov.gb2asc(str) 存入,ECov.asc2gb(str) 讀出。Oracle 瘦驅動預設以 ISO-8859-1 傳輸,故需雙向轉換。
commit();單筆可開啟。setDate()/getDate() 需注意時區與 java.sql.Date vs java.util.Date 轉換。DataSource (JNDI) + 連線池 (DBCP/HikariCP/C3P0),避免頻繁建立連線開銷。oracle.jdbc.OracleDriver,舊版 oracle.jdbc.driver.OracleDriver 已淘汰。