DriverManager

DriverManager

DriverManager管理一組 JDBC 驅動程式的基本服務。DataSource 接口是 JDBC 2.0 API 中的新增內容,它提供了連線到數據源的另一種方法。使用 DataSource 對象是連線到數據源的首選方法。

使用範圍

程式不再需要使用Class.forName()顯式地載入JDBC驅動程式。當前使用Class.forName() 載入JDBC驅動程式的現有程式將在不作修改的情況下繼續工作。

在調用getConnection方法時,DriverManager會試著從初始化時載入的那些驅動程式以及使用與當前程式相同的類載入器顯式載入的那些驅動程式中查找合適的驅動程式。

對於簡單的應用程式,一般只需要DriverManager.getConnection(該方法將建立與資料庫的連線)方法即可。JDBC 允許用戶調用 DriverManager 的方法 getDriver、getDrivers 和 registerDriver 及 Driver 的方法 connect。但多數情況下,讓 DriverManager 類管理建立連線的細節為上策。

驅動程式

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 類將試圖載入它們。

對 DriverManager 方法的第一次調用將自動載入這些驅動程式類。

注意:載入驅動程式的第二種方法需要持久的預設環境。如果對這一點不能保證,則調用方法 Class.forName 顯式地載入每個驅動程式就顯得更為安全。這也是引入特定驅動程式的方法,因為一旦 DriverManager 類被初始化,它將不再檢查 jdbc.drivers 屬性列表。

在以上兩種情況中,新載入的 Driver 類都要通過調用 DriverManager.registerDriver 類進行自我註冊。如上所述,載入類時將自動執行這一過程。

由於安全方面的原因,JDBC 管理層將跟蹤哪個類載入器提供哪個驅動程式。這樣,當 DriverManager 類打開連線時,它僅使用本地檔案系統或與發出連線請求的代碼相同的類載入器提供的驅動程式。

建立連線

載入 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");

相關詞條

相關搜尋

熱門詞條

聯絡我們