DriverManager 類是 JDBC 的管理層,作用於使用者和驅動程式之間。它跟蹤可用的驅動程式,並在資料庫和相應驅動程式之間建立串連。另外,DriverManager 類也處理諸如驅動程式登入時間限制及登入和跟蹤訊息的顯示等事務。
對於簡單的應用程式,一般程式員需要在此類中直接使用的唯一方法是DriverManager.getConnection。正如名稱所示,該方法將建立與資料庫的串連。JDBC 允許使用者調用 DriverManager 的方法 getDriver、getDrivers 和 registerDriver 及 Driver 的方法 connect。但多數情況下,讓 DriverManager 類管理建立串連的細節為上策。
1、跟蹤可用驅動程式
DriverManager 類包含一列 Driver 類,它們已通過調用方法 DriverManager.registerDriver 對自己進行了註冊。所有 Driver 類都必須包含有一個靜態部分。它建立該類的執行個體,然後在載入該執行個體時 DriverManager 類進行註冊。這樣,使用者正常情況下將不會直接調用 DriverManager.registerDriver;而是在載入驅動程式時由驅動程式自動調用。載入 Driver 類,然後自動在 DriverManager 中註冊的方式有兩種:
通過調用方法 Class.forName。這將顯式地載入驅動程式類。由於這與外部設定無關,因此推薦使用這種載入驅動程式的方法。以下代碼載入類 acme.db.Driver:
Class.forName("acme.db.Driver");
如果將 acme.db.Driver 編寫為載入時建立執行個體,並調用以該執行個體為參數的 DriverManager.registerDriver(本該如此),則它在 DriverManager 的驅動程式列表中,並可用於建立串連。
通過將驅動程式添加到 java.lang.System 的屬性 jdbc.drivers 中。這是一個由 DriverManager 類載入的驅動程式類名的列表,由冒號分隔:初始化 DriverManager 類時,它搜尋系統屬性 jdbc.drivers,如果使用者已輸入了一個或多個驅動程式,則 DriverManager 類將試圖載入它們。以下代碼說明程式員如何在 ~/.hotjava/properties 中輸入三個驅動程式類(啟動時,HotJava 將把它載入到系統屬性列表中):
jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver;
對 DriverManager 方法的第一次調用將自動載入這些驅動程式類。
注意:載入驅動程式的第二種方法需要持久的預設環境。如果對這一點不能保證,則調用方法 Class.forName 顯式地載入每個驅動程式就顯得更為安全。這也是引入特定驅動程式的方法,因為一旦 DriverManager 類被初始化,它將不再檢查 jdbc.drivers 屬性列表。
在以上兩種情況中,新載入的 Driver 類都要通過調用 DriverManager.registerDriver 類進行自我註冊。如上所述,載入類時將自動執行這一過程。
由於安全方面的原因,JDBC 管理層將跟蹤哪個類載入器提供哪個驅動程式。這樣,當 DriverManager 類開啟串連時,它僅使用本地檔案系統或與發出串連請求的代碼相同的類載入器提供的驅動程式。
2、建立串連
載入 Driver 類並在 DriverManager 類中註冊後,它們即可用來與資料庫建立串連。當調用DriverManager.getConnection 方法發出串連請求時,DriverManager 將檢查每個驅動程式,查看它是否可以建立串連。
有時可能有多個 JDBC 驅動程式可以與給定的 URL 串連。例如,與給定遠端資料庫串連時,可以使用 JDBC-ODBC 橋驅動程式、JDBC 到通用網路通訊協定驅動程式或資料庫廠商提供的驅動程式。在這種情況下,測試驅動程式的順序至關重要,因為 DriverManager 將使用它所找到的第一個可以成功串連到給定 URL 的驅動程式。
首先 DriverManager 試圖按註冊的順序使用每個驅動程式(jdbc.drivers 中列出的驅動程式總是先註冊)。它將跳過代碼不可信任的驅動程式,除非載入它們的源與試圖開啟串連的代碼的源相同。
它通過輪流在每個驅動程式上調用方法 Driver.connect,並向它們傳遞使用者開始傳遞給方法 DriverManager.getConnection 的 URL 來對驅動程式進行測試,然後串連第一個認出該 URL 的驅動程式。
這種方法初看起來效率不高,但由於不可能同時載入數十個驅動程式,因此每次串連實際只需幾個程序呼叫和字串比較。
以下代碼是通常情況下用驅動程式(例如 JDBC-ODBC 橋驅動程式)建立串連所需所有步驟的樣本:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //載入驅動程式
String url = "jdbc:odbc:fred";
DriverManager.getConnection(url, "userID", "passwd");