JDBC (Java Database Connectivity) API 是 Java 程式存取資料庫的標準介面。經過多年 Oracle JDBC 實戰經驗累積,本文整理出十大實用技巧,助您大幅提升系統效能與開發彈性。
Oracle 提供四類驅動程式:兩類供客戶端 (應用程式、Applet、Servlet) 使用,兩類供資料庫內部 Java 預存程序使用。客戶端可選 OCI (需 JNI 並安裝 Oracle Client) 或 Thin (純 Java、直連資料庫) 驅動。雖官方建議 OCI 以獲最佳效能,但實測發現 Thin 驅動在大多數情況下表現更優,且部署更輕量,強烈建議客戶端開發採用 Thin 驅動。
預設連線為自動提交模式。透過 conn.setAutoCommit(false) 關閉後,可手動控制交易 (commit()/rollback()),減少網路交互與日誌寫入,顯著提升批次處理效能。
PreparedStatement 只解析編譯一次,適合重複執行;Statement 每次都解析編譯。但實測顯示,在客戶端非批次處理的單次或動態 SQL 場景下,Statement 反而更快,且字串拼接建構動態 SQL 更直觀簡單。
動態 SQL 需處理單引號跳脫、日期格式化等細節。建立通用的 helper 方法 (如 escapeQuotes()、toOracleDate()) 集中處理,可避免錯誤並提高程式碼可維護性。
雖單次執行 PreparedStatement 稍慢,但其預編譯計劃可在共享池重用。在高併發企業應用中,大量相似 SQL 重複執行時,減少硬解析能大幅降低資料庫 CPU 負載,提升整體吞吐量。
Oracle 僅 PreparedStatement 真正支援批次處理。可用標準 JDBC addBatch()/executeBatch(),或 Oracle 專有的 setExecuteBatch(n) 搭配 executeUpdate(),效能更強。批次處理能將成百上千筆 DML 合併為一次網路往返,效能提升數量級。
PreparedStatement 對 BLOB/CLOB 支援有限,特別是 Thin 驅動不支援 setBinaryStream/setCharacterStream。必須先透過 SELECT ... FOR UPDATE 取得 LOB Locator,再呼叫 Locator 的 getBinaryStream()/setBytes() 等方法讀寫。
雖 Oracle 支援 PL/SQL 區塊呼叫,但 SQL92 {call proc(?,?)} 標準語法可移植性更好,維護者更易閱讀,建議統一採用。
Oracle 支援物件關聯特性。可在資料庫定義物件型別、建立方法,再用 JPublisher 產生 Java Bean。如此不僅 Java 應用受益,其他異構系統也能共享同一套資料與業務邏輯,實現真正的「寫一次,到處執行」。
最重要的原則:能用單一 SQL 解決的,絕不寫 Java 迴圈逐筆處理。例如多表關聯更新、聚合統計等,SQL 集合運算效能遠超程式語言逐行處理,且能減少網路傳輸。請深入鑽研 SQL 進階功能 (分析函數、MERGE、WITH 子句等)。
這十大技巧涵蓋驅動選擇、交易控制、SQL 執行策略、批次處理、LOB 處理、可移植性與物件關聯開發。實務上請根據具體場景靈活組合,持續進行效能基準測試,才能榨乾 JDBC 與 Oracle 的最大效能。