[英]Autoloading java static blocks
对于JDBC4,需要自动加载JDBC驱动程序。 它是通过添加一个静态块来实现的,其中驱动程序在DriverManager中注册。 但是当我在我的类中编写这样的块时,它只在我创建这个类的对象时执行。 否则代码不会运行。
我的问题是:当它们不是从应用程序代码创建时,驱动程序如何自我启动,但是当我使用它来获取数据库连接时,它们是在DriverManager中注册的?
JDBC4规范的第9.2段规定, Driver
实现必须在类加载时将自身注册到DriverManager
,以便在加载Driver
实现时,静态初始化程序将自动注册驱动程序的实例。
因此,只需通过( Class.forName("driverClassName")
)加载Driver
实现,就会使用DriverManager
注册驱动程序。
或者,规范提供了一种方法,通过系统属性jdbc.drivers
在外部指定要由DriverManager
加载(并因此注册)的驱动程序(参见第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节,第一个项目符号)。
在使用DataSource
版本的JDBC中,您经常会看到对Class.forName("driver.class")
的调用
在以前的JDBC版本中,要获得连接,首先必须通过调用Class.forName方法来初始化JDBC驱动程序。 此方法需要java.sql.Driver类型的对象。 每个JDBC驱动程序都包含一个或多个实现接口java.sql.Driver的类。
文件进一步指出:
在类路径中找到的任何JDBC 4.0驱动程序都会自动加载。 (但是,必须使用方法Class.forName手动加载JDBC 4.0之前的任何驱动程序。)
所以我假设正在扫描类路径以查找实现驱动程序接口的任何类。
您可以使用Java的ServiceLoader
工具自动加载服务。
您需要在列出您的类的JAR中放置一个文件,然后Java将在需要服务时自动加载它。 有关更多详细信息,请查看ServiceLoader的文档。
这个类似问题的答案实际上说这是JDBC使用的方式。
通常使用Class.forName
初始化类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.