1

至于 JDBC4 则要求 JDBC 驱动程序自动加载。它是通过添加一个静态块来制作的,该块驱动程序在 DriverManager 中注册。但是,当我在我的类中编写这样的块时,它仅在我创建此类的对象时执行。否则代码不会运行。

我的问题是:驱动程序如何自我初始化,当它们不是从应用程序代码创建时,但是当我使用它来获取数据库连接时它们在 DriverManager 中注册?

4

4 回答 4

2

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。

DriverManageron DriverManager.getConnection()calls )使用java.sql.Driver服务提供者并加载指定的类,从而自动注册驱动程序。这消除了调用的需要Class.forName(参见第 9.2.1 段和第 3.1 段,第一个项目符号)。

于 2013-02-04T11:15:00.717 回答
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 之前的所有驱动程序。)

所以我假设正在扫描类路径以查找任何实现驱动程序接口的类。

于 2013-02-04T11:05:47.287 回答
1

您可以使用ServiceLoaderJava 的工具来自动加载服务。

您需要在列出您的类的 JAR 中放置一个文件,然后 Java 会在需要该服务时自动加载它。查看 ServiceLoader 的文档以获取更多详细信息。

这个类似问题的答案实际上是说这是 JDBC 使用的方式。

于 2013-02-04T11:12:30.233 回答
0

通常你Class.forName用来初始化类。

于 2013-02-04T11:05:52.543 回答