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