DriverManager 驅動管理器類簡介 JDBC簡介(三)

驅動程序管理器是負責管理驅動程序的,驅動註冊之後,會保存在DriverManager中的已註冊列表中
後續的處理就能夠對這個列表進行操做
image_5c3e8a21_2da8
簡言之,驅動管理器,就是字面含義,主要負責就是 管理 驅動

概述

image_5c3e8a21_4776
提供管理一組 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對象
image_5c3e8a21_7cc8
能夠看得出來,三個公共的getConnection方法並無什麼太多邏輯,只是參數形式的適配,方法內部調用的都是私有的getConnection方法
在方法內部主要就是循環遍歷全部的已註冊的驅動程序,嘗試創建鏈接
若是創建鏈接成功,就返回這個鏈接
image_5c3e8a21_6912

驅動程序查找

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 知道本身
image_5c3e8a21_222
兩個方法的區別在於new DriverInfo(driver, da)的第二個參數,類型爲DriverAction
當驅動程序想要被驅動管理器通知時必須實現的接口。
JDBC驅動程序的靜態初始化塊中使用雙參數版本的註冊方法時,當驅動程序被卸載時,會被調用。
image_5c3e8a21_551a
 
卸載
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() 
image_5c3e8a22_19e8
 
除了可以對日誌、追蹤對象進行設置和獲取外
還有日誌記錄方法,藉助於logWriter進行寫入,而後刷新
public  static void println(String message)
image_5c3e8a22_9c9 

總結

DriverManager用於管理驅動程序以及驅動程序的註冊相關,應用程序開發者主要關注於藉助於驅動程序管理器建立指定的鏈接
也就是說重點關注於getConnection方法,全部後續的數據庫操做都要基於這個鏈接進行,其餘的一些方法瞭解下便可,開發環境中是基本不會直接接觸的
相關文章
相關標籤/搜索