驱动注册中提到过,拥有初始化方法 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)