至于 JDBC4 则要求 JDBC 驱动程序自动加载。它是通过添加一个静态块来制作的,该块驱动程序在 DriverManager 中注册。但是,当我在我的类中编写这样的块时,它仅在我创建此类的对象时执行。否则代码不会运行。
我的问题是:驱动程序如何自我初始化,当它们不是从应用程序代码创建时,但是当我使用它来获取数据库连接时它们在 DriverManager 中注册?
至于 JDBC4 则要求 JDBC 驱动程序自动加载。它是通过添加一个静态块来制作的,该块驱动程序在 DriverManager 中注册。但是,当我在我的类中编写这样的块时,它仅在我创建此类的对象时执行。否则代码不会运行。
我的问题是:驱动程序如何自我初始化,当它们不是从应用程序代码创建时,但是当我使用它来获取数据库连接时它们在 DriverManager 中注册?
JDBC4 规范的第 9.2 段规定,Driver
实现必须DriverManager
在类加载时注册自己,以便在Driver
加载实现时静态初始化程序将自动注册驱动程序的实例。
Driver
因此,只需通过 ( )加载实现Class.forName("driverClassName")
,将使用DriverManager
.
DriverManager
或者,规范提供了一种通过系统属性从外部指定要加载(并因此注册)的驱动程序的方法jdbc.drivers
(参见第 9.2.1 段):
java -Djdbc.drivers=com.acme.jdbc.AcmeJdbcDriver Test
这些注册方法在旧的 JDBC3 实现中也可用。
JDBC4 引入了一种新的注册方法,利用了服务提供者机制:每个兼容的驱动程序都必须提供一个包含META-INF/services/java.sql.Driver
文件的 jar。
(DriverManager
on DriverManager.getConnection()
calls )使用java.sql.Driver
服务提供者并加载指定的类,从而自动注册驱动程序。这消除了调用的需要Class.forName
(参见第 9.2.1 段和第 3.1 段,第一个项目符号)。
在以前版本的 JDBC 中,当使用 a 时,DataSource
您经常会看到调用Class.forName("driver.class")
在以前的 JDBC 版本中,要获得连接,首先必须通过调用方法 Class.forName 来初始化 JDBC 驱动程序。此方法需要 java.sql.Driver 类型的对象。每个 JDBC 驱动程序都包含一个或多个实现接口 java.sql.Driver 的类。
该文件进一步指出:
在您的类路径中找到的任何 JDBC 4.0 驱动程序都会自动加载。(但是,您必须使用 Class.forName 方法手动加载 JDBC 4.0 之前的所有驱动程序。)
所以我假设正在扫描类路径以查找任何实现驱动程序接口的类。
您可以使用ServiceLoader
Java 的工具来自动加载服务。
您需要在列出您的类的 JAR 中放置一个文件,然后 Java 会在需要该服务时自动加载它。查看 ServiceLoader 的文档以获取更多详细信息。
这个类似问题的答案实际上是说这是 JDBC 使用的方式。
通常你Class.forName
用来初始化类。