DriverManager 驱动管理器类简介 JDBC简介(三)
驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中后续的处理就可以对这个列表进行操作
!(data/attachment/forum/202208/27/164130k9ci0pp5pp30afpp.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
简言之,驱动管理器,就是字面含义,主要负责就是**管理 驱动**
### 概述
!(data/attachment/forum/202208/27/164148o05xpus0hgxhm9mm.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
提供管理一组 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 或应用程序相同的类加载器显式加载的那些驱动程序中查找合适的驱动程序。
`本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/`
### 创建连接
DriverManager负责驱动程序管理,数据库驱动则是为了应用程序服务的,所以DriverManager的重要任务就是提供连接的获取。
通过DriverManager获得连接,对应用程序开发者是非常重要的一件事情。
通过getConnection方法获得Connection对象
!(data/attachment/forum/202208/27/164207k24b92orr9k9hbno.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
!(data/attachment/forum/202208/27/164218piqdcmi90bcq9nci.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
可以看得出来,三个公共的getConnection方法并没有什么太多逻辑,只是参数形式的适配,方法内部调用的都是私有的getConnection方法
在方法内部主要就是循环遍历所有的已注册的驱动程序,尝试建立连接
如果建立连接成功,就返回这个连接
!(data/attachment/forum/202208/27/164233qcav1ea3xdx3jax3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### 驱动程序查找
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 知道自己
!(data/attachment/forum/202208/27/164249ftgf3lgvr94kl3uh.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
两个方法的区别在于new DriverInfo(driver, da)的第二个参数,类型为DriverAction
当驱动程序想要被驱动管理器通知时必须实现的接口。
JDBC驱动程序的静态初始化块中使用双参数版本的注册方法时,当驱动程序被卸载时,会被调用。
!(data/attachment/forum/202208/27/164305n566m2ixk52puge2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
**卸载**
`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()`
!(data/attachment/forum/202208/27/164401nd22ra3r0qrn8gr2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
除了能够对日志、追踪对象进行设置和获取外
还有日志记录方法,借助于logWriter进行写入,然后刷新
`publicstatic void println(String message)`
!(data/attachment/forum/202208/27/164421g7cwdd1cd5wqpc8q.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### 总结
DriverManager用于管理驱动程序以及驱动程序的注册相关,应用程序开发者主要关注于借助于驱动程序管理器创建指定的连接
也就是说重点关注于getConnection方法,所有后续的数据库操作都要基于这个连接进行,其他的一些方法了解下即可,开发环境中是基本不会直接接触的
!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-170-1-1.html `
页:
[1]