对于JDBC4,需要自动加载JDBC驱动程序。它是通过添加一个静态块来实现的,其中驱动程序在DriverManager中注册。但是当我在我的类中编写这样的块时,它只在我创建这个类的对象时执行。否则代码不会运行。
我的问题是:当驱动程序没有从应用程序代码创建时,它们如何自我启动,但是当我使用它来获取数据库连接时它们在DriverManager中注册了?
答案 0 :(得分: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。
DriverManager
(在DriverManager.getConnection()
调用上)使用java.sql.Driver
服务提供程序并加载指定的类,从而自动注册驱动程序。这消除了调用Class.forName
的需要(见第9.2.1段和第3.1段,第一个子弹)。
答案 1 :(得分:1)
在使用DataSource
的早期版本的JDBC中,您经常会看到对Class.forName("driver.class")
的调用
在以前的JDBC版本中,要获得连接,首先必须这样做 通过调用Class.forName方法初始化JDBC驱动程序。这个 方法需要java.sql.Driver类型的对象。每个JDBC驱动程序 包含一个或多个实现该接口的类 java.sql.Driver中。
文件进一步说明:
在类路径中找到的任何JDBC 4.0驱动程序都是 自动加载。 (但是,您必须手动加载任何驱动程序 在JDBC 4.0之前使用方法Class.forName。)
因此,我假设正在扫描实现驱动程序接口的任何类的类路径。
答案 2 :(得分:1)
您可以使用Java的ServiceLoader
工具自动加载服务。
您需要在列出您的类的JAR中放置一个文件,然后Java将在需要服务时自动加载它。有关详细信息,请查看ServiceLoader的文档。
这个similar question的答案实际上说这是JDBC使用的方式。
答案 3 :(得分:0)
通常使用Class.forName
来初始化类。