DriverManager 是 JDBC 架構的管理層,位於應用程式與 JDBC 驅動程式之間,負責追蹤可用驅動、建立資料庫連線、處理驅動登入逾時與日誌訊息。對大多數簡單應用,開發者只需直接使用 DriverManager.getConnection() 即可。
DriverManager 維護一份已註冊的 Driver 類別清單。所有 JDBC 驅動類別必須包含靜態初始化區塊,在類別載入時建立實例並自動向 DriverManager 註冊:
// 驅動程式內部典型實作
public class MyDriver implements Driver {
static {
try {
DriverManager.registerDriver(new MyDriver());
} catch (SQLException e) {
throw new RuntimeException("驅動註冊失敗", e);
}
}
// ... 實作 Driver 介面方法
}
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8.0+
// 或
Class.forName("oracle.jdbc.OracleDriver"); // Oracle
優點:不依賴外部環境設定,程式碼可攜性最佳。
// 在 ~/.hotjava/properties 或啟動參數中設定
jdbc.drivers=com.mysql.cj.jdbc.Driver:oracle.jdbc.OracleDriver:org.postgresql.Driver
DriverManager 初始化時會讀取此屬性並嘗試載入。注意:DriverManager 初始化後不會再檢查此屬性,故必須在首次呼叫前設定。
JDBC 管理層會追蹤哪個類別載入器載入哪個驅動。建立連線時,DriverManager 僅使用來自本地檔案系統、或與發出連線請求的程式碼相同類別載入器所提供的驅動,防止惡意程式碼注入偽造驅動。
呼叫 DriverManager.getConnection(url, user, pass) 時,流程如下:
jdbc.drivers 列出的優先)Driver.connect(url, props),傳入 URL 與連線屬性Connection)的驅動獲勝雖看似低效,但實際載入驅動數極少,僅需幾次方法呼叫與字串比對。
// 1. 載入驅動
Class.forName("org.postgresql.Driver");
// 2. 定義連線 URL(格式視驅動而定)
String url = "jdbc:postgresql://localhost:5432/mydb";
// 3. 取得連線
Connection conn = DriverManager.getConnection(url, "username", "password");
try {
// 使用連線...
} finally {
if (conn != null) conn.close();
}
企業級應用建議使用 javax.sql.DataSource(配合 JNDI),優點包括:
理解 DriverManager 運作機制,有助於排查連線問題、優化驅動載入策略,並為遷移至 DataSource 打下基礎。