Class.forName似乎仍然是必要的

时间:2016-06-17 08:28:48

标签: java jdbc jar

来自Java documentation

  

在以前的JDBC版本中,要获得连接,首先必须通过调用Class.forName方法来初始化JDBC驱动程序。

     

自动加载在类路径中找到的任何JDBC 4.0驱动程序。 (但是,必须使用方法Class.forName手动加载JDBC 4.0之前的任何驱动程序。)

我有一个连接到SQL Server Express 2016的平针织Webservice。它有sqljdbc42.jar,它是4.2驱动程序,在CLASSPATH中

但是,如果我省略Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")调用,我的DriverManager.getConnection会抛出SQLException(没有为jdbc找到合适的驱动程序:sqlserver:// localhost:1433; ....& #34;)

我添加getConnection电话后Class.forName开始成功。

我在Java 8上。

我错过了什么?

更新:我刚试了一个命令行程序,它没有forName。但是,在我的Eclipse IDE中,我在本地主机上运行我的REST服务作为Tomcat 8.0服务器,它不起作用。

1 个答案:

答案 0 :(得分:7)

由于DriverManager(服务提供者接口),类SPI本身已初始化时,驱动程序会自动初始化。这意味着在内部它将尝试查找上下文类加载器中可用的任何文件META-INF/services/java.sql.Driver,并且对于找到的每个文件,它将创建在文件中定义的类的实例,在这种情况下实际上是FQN对于JDBC驱动程序,这是从JDBC开始自动初始化JDBC 4.0个驱动程序的方式。

但是这只能在初始化类DriverManager时从上下文类加载器中获得驱动程序时才有效。确保这一点的一个好方法是在层次结构中使Class Loader足够高的驱动程序可用。在您的情况下,您应该将您的驱动程序放在tomcat/lib。实际上,这样你的驱动程序就可以从Common CL获得,它应该足够高。有关Tomcat here中的CL层次结构的更多详细信息。