不再需要Class.forName(JDBC_DRIVER)?
我已经在这里阅读了自从java 6以来你不再需要使用以下命令注册JDBC Driver:
Class.forName(JDBC_DRIVER);
因为DriverManager使用位于系统属性“jdbc.drivers”中的路径来检索正确的驱动程序。
但是当我做以下时:
System.out.print(System.getProperty("jdbc.drivers"));
null
被打印。
你有什么线索为什么我的应用程序正常工作? ;)
这与该系统属性无关。 Java6(和JDBC4)引入了一个称为“ 服务提供者 ”的概念,其中JVM在启动期间可以检测到已知接口的实现。 符合该标准的驱动程序将由DriverManager自动注册。 这就是Class.forName()
不再需要的原因 – 但仅当驱动程序支持它时。
如果META-INF目录中的驱动程序jar文件中有services
目录,则启动服务注册。 该目录需要包含一个文本文件,该文件具有在包含实现类的java.sql.Driver
的JDBC驱动程序的情况下实现的接口的名称。
从DriverManager
的Javadocs:
作为初始化的一部分,
DriverManager
类将尝试加载“jdbc.drivers”系统属性中引用的驱动程序类。 这允许用户自定义其应用程序使用的JDBC驱动程序。 例如,在〜/ .hotjava / properties文件中,您可以指定:jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver
这意味着应该指定系统属性。 它并没有说在注册驱动程序时类会自动填充此属性。
至于你的应用程序工作的原因,你可能想检查你是否已经调用了DriverManager#registerDriver()
(尽管大多数驱动程序都不需要这样做)。 如果是,则驱动程序已注册。 否则,应用程序可能具有服务提供者文件,如上所述:
DriverManager
方法getConnection
和getDrivers
已得到增强,可支持Java Standard Edition Service Provider机制。 JDBC 4.0驱动程序必须包含文件META-INF/services/java.sql.Driver
。 此文件包含java.sql.Driver的JDBC驱动程序实现的名称。 例如,要加载my.sql.Driver class
,META-INF/services/java.sql.Driver
文件将包含以下条目: