JDBC API 為 Java 程式存取資料庫提供標準介面,但不同廠商實作細節差異極大。基於多年 Oracle JDBC 實戰經驗,本文整理十大關鍵技巧,助你大幅提升系統效能與開發效率。
Oracle 提供四類驅動:OCI(需客戶端安裝、走 JNI)與 Thin(純 Java、直連資料庫)用於客戶端;另外兩類用於伺服器端存儲過程。官方文件推薦 OCI,但實測 Thin 驅動在多數場景效能更優,且部署輕量、無需客戶端安裝,強烈建議客戶端開發採用 Thin 驅動。
連線預設為自動提交模式,頻繁提交嚴重拖累效能。關閉自動提交:
conn.setAutoCommit(false);
隨後手動管理事務:commit() 提交、rollback() 回滾。批次處理時效能提升顯著。
雖然 PreparedStatement 預編譯可重用,但客戶端測試顯示:單次或少量執行、動態 SQL 組裝、有嚴格時效要求的操作,Statement 反而更快且程式碼更簡潔(字串串接即可建構動態 SQL)。批次處理或高頻重複執行才換用 PreparedStatement。
動態 SQL 易因引號、日期格式出錯。建立統一的 helper 方法:處理單引號轉義(雙引號)、日期轉 TO_DATE() 字串等,集中管理格式化邏輯,減少錯誤並提升可維護性。
高併發系統中,相同 SQL 重複執行極多。PreparedStatement 經解析、編譯後置入指令緩衝區,後續執行僅重新解析不再編譯,大幅降低資料庫 CPU 負載。除客戶端單次操作外,企業級應用應盡量採用。
Oracle 僅 PreparedStatement 真正支援批次。兩種方式:
addBatch() + executeBatch()setExecuteBatch(n) + 標準 executeUpdate(),累積 n 筆自動送入;或呼叫 sendBatch() 強制刷新((OraclePreparedStatement)pstmt).setExecuteBatch(30);
pstmt.executeUpdate(); // 累積 30 筆自動批次送入
PreparedStatement 對 BLOB/CLOB 支援不全(尤其 Thin 驅動不支援 setBinaryStream/setCharacterStream)。唯有 Locator 方法能正確讀寫 LOB。建議統一採用 Locator API 插入、更新、讀取大物件。
可用 Oracle PL/SQL 或 SQL92 呼叫存儲過程。PL/SQL 無實質優勢且增加維護困擾(綁定廠商語法),統一採用標準 SQL92:{call procedure_name(?, ?)}。
利用 Oracle 物件關聯特性,在資料庫建立物件型別封裝資料與操作,再用 JPublisher 產生 Java Bean。不僅 Java 應用受益,其他異構系統也能共享完整的物件模型(資料+行為),打破「邏輯只在應用層」的孤島。
最核心原則:SQL 擅長集合運算。例如:查詢多筆記錄、每筆再關聯查詢、最後批次更新——可改寫為單一 UPDATE 搭配多欄子查詢完成。避免資料在網路與應用層來回搬運,充分發揮資料庫引擎優勢。深入掌握進階 SQL 是架構師的必修課。