Oracle提供四類驅動:客戶端用Thin(純Java)和OCI(JNI調用客戶端庫)。實測Thin驅動在大多數場景性能優於OCI,且部署簡單無需安裝Oracle Client。推薦配置:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@host:1521:service", user, pass);
conn.setAutoCommit(false);
// 批量操作...
conn.commit(); // 或 conn.rollback();
減少日志同步開銷,成批提交大幅提升吞吐。注意:必須配合異常處理確保事務邊界正確。
實測客戶端場景Statement動態SQL表現更好,服務端高併發PreparedStatement優勢明顯。
// 單引號轉義
String escapeSql(String s) { return s.replace("'", "''"); }
// 日期轉Oracle格式
String toOracleDate(Date d) {
return "TO_DATE('" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d) + "','YYYY-MM-DD HH24:MI:SS')";
}
// 使用示例
String sql = "INSERT INTO t VALUES (" + escapeSql(name) + ", " + toOracleDate(dt) + ")";
企業級應用中相同SQL高頻重複,預編譯緩存減少解析CPU,共享池復用降低內存壓力。雖單次準備耗時略長,但整體收益顯著。
Oracle僅PreparedStatement真正支持批處理:
// 標準JDBC批處理
ps.addBatch(); ps.executeBatch();
// Oracle專有批處理(更快)
((OraclePreparedStatement)ps).setExecuteBatch(30);
ps.executeUpdate(); // 累積30條自動發送
ps.sendBatch(); // 主動刷新
專有批處理減少網絡往返,大批量INSERT/UPDATE性能提升10-100倍。
PreparedStatement.setObject/setBinaryStream對BLOB/CLOB支持有限(特別是Thin驅動)。正確模式:
// 插入CLOB
String sql = "INSERT INTO docs(id, content) VALUES (?, EMPTY_CLOB()) RETURNING content INTO ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.registerOutParameter(2, OracleTypes.CLOB);
ps.execute();
Clob clob = ((OracleCallableStatement)ps).getClob(2);
clob.setString(1, largeText);
// 推薦: 標準SQL92
"{call schema.proc(?, ?)}"
"{? = call schema.func(?, ?)}"
// 避免: Oracle專有PL/SQL塊
"BEGIN schema.proc(?, ?); END;"
SQL92可移植、工具支持好、維護成本低。
利用Oracle對象類型+JPublisher生成Java類,將業務邏輯下沉數據庫:
CREATE TYPE addr_t AS OBJECT (street VARCHAR2(50), city VARCHAR2(30));
CREATE TYPE person_t AS OBJECT (name VARCHAR2(30), address addr_t,
MEMBER FUNCTION full_addr RETURN VARCHAR2);
優勢:多語言應用共享業務邏輯、數據一致性強、減少網絡傳輸。
反模式:Java循環查詢明細 → 循環更新主表
最佳模式:單條MERGE或多表UPDATE:
UPDATE orders o
SET (total_amt, item_cnt) = (
SELECT SUM(price*qty), COUNT(*)
FROM order_items i WHERE i.order_id = o.id
)
WHERE o.status = 'PENDING';
讓數據庫引擎發揮集合運算優勢,避免數據網絡傳輸開銷。