gpt4 book ai didi

java - Class.forName 似乎仍然是必要的

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:23 25 4
gpt4 key购买 nike

来自Java documentation

In previous versions of JDBC, to obtain a connection, you first had to initialize your JDBC driver by calling the method Class.forName.

Any JDBC 4.0 drivers that are found in your class path are automatically loaded. (However, you must manually load any drivers prior to JDBC 4.0 with the method Class.forName.)

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

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

添加 Class.forName 调用后,getConnection 开始成功。

我正在使用 Java 8。

我错过了什么?

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

最佳答案

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

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

关于java - Class.forName 似乎仍然是必要的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37876684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com