我已经在这里阅读了自从Java 6以来你不再需要使用以下命令注册JDBC驱动程序:
Class.forName(JDBC_DRIVER);
因为DriverManager使用位于系统属性" jdbc.drivers" 中的路径 检索正确的驱动程序。
但是当我这样做时:
System.out.print(System.getProperty("jdbc.drivers"));
null
被打印出来。
你有什么线索为什么我的应用程序正常工作? ;)
答案 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
方法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
文件将包含条目: