在 Java 開發中,java.sql 套件提供的 Driver、Connection 等介面為開發者建立了統一的資料庫操作規範。雖然日常開發只需熟悉這些介面的方法簽名,但深入理解其底層運作機制,不僅有助於排查疑難雜症,更能學習到 Interface 導向程式設計等經典模式。本文將剖析 JDBC 從驅動載入到連接建立的核心流程。
當我們呼叫 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") 時,JVM 會執行類的載入與初始化過程。此方法最終委託給 forName0 原生方法,將指定類載入記憶體。關鍵在於:類載入過程會執行該類的 static 靜態區塊,這正是 JDBC 驅動自我註冊的核心時機。
以 Sun 提供的 JDBC-ODBC 橋接驅動為例,其原始碼揭示了標準驅動的註冊模式:
public class JdbcOdbcDriver extends JdbcOdbcObject implements JdbcOdbcDriverInterface {
// ... 省略其他方法 ...
static {
if (JdbcOdbcObject.isTracing())
JdbcOdbcObject.trace("JdbcOdbcDriver class loaded");
JdbcOdbcDriver jdbcodbcdriver = new JdbcOdbcDriver();
try {
DriverManager.registerDriver(jdbcodbcdriver);
} catch (SQLException sqlexception) {
if (JdbcOdbcObject.isTracing())
JdbcOdbcObject.trace("Unable to register driver");
}
}
}
核心邏輯:
new JdbcOdbcDriver()DriverManager.registerDriver() 將自身註冊至驅動管理器這就是為什麼我們只需 Class.forName() 而無需顯式實例化驅動的原因——驅動在載入時自動完成註冊,體現了「服務提供者介面(SPI)」的設計思想。
當應用程式呼叫 DriverManager.getConnection(url, user, password) 時,內部流程如下:
public static synchronized Connection getConnection(String url, String user, String password) throws SQLException {
Properties info = new Properties();
ClassLoader callerCL = DriverManager.getCallerClassLoader();
if (user != null) info.put("user", user);
if (password != null) info.put("password", password);
return getConnection(url, info, callerCL);
}
private static synchronized Connection getConnection(String url, Properties info, ClassLoader callerCL) throws SQLException {
// 遍歷已註冊驅動
for (DriverInfo di : registeredDrivers) {
// 呼叫驅動的 connect 方法嘗試建立連接
Connection result = di.driver.connect(url, info);
if (result != null) return result;
}
throw new SQLException("No suitable driver");
}
關鍵步驟:
connect(url, info) 方法驅動的 connect 方法負責實際的連接邏輯:
public synchronized Connection connect(String url, Properties properties) throws SQLException {
if (!acceptsURL(url)) return null; // URL 格式不匹配,快速失敗
// 清理舊連接資源
if (hDbc != 0) { disconnect(hDbc); closeConnection(hDbc); hDbc = 0; }
if (!initialize()) return null; // ODBC 環境初始化
// 建立具體連接物件
JdbcOdbcConnection conn = new JdbcOdbcConnection(OdbcApi, hEnv, this);
conn.initialize(getSubName(url), properties, DriverManager.getLoginTimeout());
conn.setURL(url);
return conn;
}
此處體現了模板方法模式:acceptsURL 判斷是否支援該 URL,initialize 處理底層 ODBC 環境初始化,最後建立具體的 JdbcOdbcConnection。

整個流程展示了經典的介面導向設計:
java.sql.* 介面DriverManager 統一管理驅動註冊與連接分發JdbcOdbcDriver、OracleDriver 等)這種架構使得應用程式與具體資料庫實現完全解耦,更換資料庫只需替換驅動 JAR 包與連接 URL,無需修改業務代碼——這正是 JDBC 設計的精髓所在。