驱动程序管理器是负责管理驱动程序的, 驱动注册以后, 会保存在 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()
除了能够对日志, 追踪对象进行设置和获取外
还有日志记录方法, 借助于 logWriter 进行写入, 然后刷新
public static void println(String message)
总结
DriverManager 用于管理驱动程序以及驱动程序的注册相关, 应用程序开发者主要关注于借助于驱动程序管理器创建指定的连接
也就是说重点关注于 getConnection 方法, 所有后续的数据库操作都要基于这个连接进行, 其他的一些方法了解下即可, 开发环境中是基本不会直接接触的
来源: https://www.cnblogs.com/noteless/p/10275323.html