不再需要Class.forName(JDBC_DRIVER)?

时间:2015-01-29 17:18:38

标签: java sql jdbc

我已经在这里阅读了自从Java 6以来你不再需要使用以下命令注册JDBC驱动程序:

Class.forName(JDBC_DRIVER);

因为DriverManager使用位于系统属性" jdbc.drivers" 中的路径 检索正确的驱动程序。

但是当我这样做时:

System.out.print(System.getProperty("jdbc.drivers"));

null被打印出来。

你有什么线索为什么我的应用程序正常工作? ;)

2 个答案:

答案 0 :(得分:11)

这与该系统属性无关。 Java6(和JDBC4)引入了一个称为“service provider”的概念,其中JVM在启动期间可以检测到已知接口的实现。符合该标准的驱动程序将由DriverManager自动注册。这就是为什么不再需要Class.forName() - 但只有当驱动程序支持它时才会这样。

如果META-INF目录中驱动程序的jar文件中有services目录,则启动服务注册。该目录需要包含一个文本文件,其中包含在包含实现类的java.sql.Driver的JDBC驱动程序中实现的接口名称。

答案 1 :(得分:2)

来自DriverManager的Javadoc:

  

作为初始化的一部分,DriverManager类将尝试加载“jdbc.drivers”系统属性中引用的驱动程序类。这允许用户自定义其应用程序使用的JDBC驱动程序。例如,在〜/ .hotjava / properties文件中,您可以指定:

jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver

这意味着应该指定系统属性。它并没有说在注册驱动程序时类会自动填充此属性。

至于你的应用程序运行的原因,你可能想检查你是否已经调用了方法DriverManager#registerDriver()(尽管大多数驱动程序都不需要这样做)。如果是,则驱动程序已注册。否则,应用程序可能具有服务提供者文件,如上所述:

  

DriverManager方法getConnectiongetDrivers已得到增强,可支持Java Standard Edition Service Provider机制。 JDBC 4.0驱动程序必须包含文件META-INF/services/java.sql.Driver。此文件包含java.sql.Driver的JDBC驱动程序实现的名称。例如,要加载my.sql.Driver classMETA-INF/services/java.sql.Driver文件将包含条目: