繁体   English   中英

自动加载java静态块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM