驅動程序管理器是負責管理驅動程序的,驅動注冊以后,會保存在DriverManager中的已注冊列表中
后續的處理就可以對這個列表進行操作
簡言之,驅動管理器,就是字面含義,主要負責就是
管理 驅動
概述
提供管理一組 JDBC 驅動程序的基本服務。
驅動注冊中提到過,擁有初始化方法 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)
public static int getLoginTimeout()
日志
DriverManager內部有一個PrintWriter
這個PrintWriter 是DriverManager 和所有驅動程序使用的日志/追蹤 對象
提供了set和get方法
public static void setLogWriter(java.io.PrintWriter out)
public static java.io.PrintWriter getLogWriter()
總結
DriverManager用於管理驅動程序以及驅動程序的注冊相關,應用程序開發者主要關注於借助於驅動程序管理器創建指定的連接
也就是說重點關注於getConnection方法,所有后續的數據庫操作都要基於這個連接進行,其他的一些方法了解下即可,開發環境中是基本不會直接接觸的