驅動註冊中提到過,擁有初始化方法 loadInitialDrivers();
主要兩件事情:
讀取jdbc.drivers系統屬性加載以及查詢符合4.0規範的驅動程序加載。
DriverManager 類會嘗試加載在 "jdbc.drivers" 系統屬性中引用的驅動程序類。
這容許用戶定製由他們的應用程序使用的 JDBC Driver。例如,能夠在properties 文件中,指定:
jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver
JDBC 4.0 Drivers 必須包括 META-INF/services/java.sql.Driver 文件。此文件包含 java.sql.Driver 的 JDBC 驅動程序實現的名稱。
例如,要加載 my.sql.Driver 類,META-INF/services/java.sql.Driver 文件須要包含下面的條目:
my.sql.Driver
應用程序再也不須要使用 Class.forName() 顯式地加載 JDBC 驅動程序。
當前使用 Class.forName() 加載 JDBC 驅動程序的現有程序將在不做修改的狀況下繼續工做。
在調用 getConnection 方法時,DriverManager 會試着從初始化時加載的那些驅動程序以及使用與當前 applet 或應用程序相同的類加載器顯式加載的那些驅動程序中查找合適的驅動程序。
建立鏈接
DriverManager負責驅動程序管理,數據庫驅動則是爲了應用程序服務的,因此DriverManager的重要任務就是提供鏈接的獲取。
經過DriverManager得到鏈接,對應用程序開發者是很是重要的一件事情。
經過getConnection方法得到Connection對象
能夠看得出來,三個公共的getConnection方法並無什麼太多邏輯,只是參數形式的適配,方法內部調用的都是私有的getConnection方法
在方法內部主要就是循環遍歷全部的已註冊的驅動程序,嘗試創建鏈接
若是創建鏈接成功,就返回這個鏈接
驅動程序查找
DriverManager管理驅動程序,不單單提供了藉助於驅動程序建立鏈接的能力
還可以返回給定的Driver或者Driver 列表
public static Driver getDriver(String url) throws SQLException
public static java.util.Enumeration<Driver> getDrivers()
getDriver
給定一個URL,查找能理解給定 URL 的驅動程序。DriverManager 試圖從已註冊的 JDBC 驅動程序集中選擇一個適當的驅動程序。
若是不存在throw new SQLException("No suitable driver", "08001");
getDrivers
getDrivers 返回的是一個枚舉 java.util.Enumeration<Driver>
註冊與卸載
如同倉庫,有進貨和出貨,DriverManager做爲驅動程序管理器,須要提供註冊和卸載的能力。
相關的方法爲registerDriver和deregisterDriver
註冊和卸載應用程序開發者不須要過多關注
註冊
有兩個版本的註冊方法,核心是同樣的,都是用於將驅動程序記錄在案,保存在容器中
新加載的驅動程序類應該調用 registerDriver 方法讓 DriverManager 知道本身
兩個方法的區別在於new DriverInfo(driver, da)的第二個參數,類型爲DriverAction
當驅動程序想要被驅動管理器通知時必須實現的接口。
JDBC驅動程序的靜態初始化塊中使用雙參數版本的註冊方法時,當驅動程序被卸載時,會被調用。
卸載
public static void deregisterDriver(Driver driver)
throws SQLException
從DriverManager的註冊驅動程序列表中移除指定的驅動程序。
若是參數爲NULL,什麼都不作
若是存在安全管理器且它的checkPermission拒絕權限,則會拋出SecurityException。
若是在註冊的驅動程序列表中沒有找到指定的驅動程序,什麼都不作;若是找到驅動程序,它將從註冊驅動程序列表中刪除。
若是在註冊JDBC驅動程序時指定了DriverAction ,那麼在從註冊驅動程序列表中刪除驅動程序以前,將調用他的deregister方法。
鏈接超時設置
驅動程序試圖鏈接到某一數據庫時的最大等待時長
loginTimeout,以秒爲單位,能夠對這個數值進行設置和讀取。
public static void setLoginTimeout(int seconds)