何时通过Web应用程序中的JDBC连接到数据库时需要Class.forName?

时间:2011-11-09 22:47:29

标签: mysql tomcat jdbc

根据this tutorial,使用JDBC 4.0+驱动程序不再需要调用Class.forName。我成功地遵循了示例中的方法(只是调用DriverManager.getConnection)来获取使用MySQL的独立程序,但是当我尝试从作为在Tomcat上运行的Web应用程序的一部分的类连接到完全相同的数据库时7,它不起作用;相反,我得到了No suitable driver found例外。

mysql-connector-java-5.1.18-bin.jar文件位于tomcat\webapps\DatabaseProject\WEB-INF\lib,我进行了三次检查,但它无效,所以我开始尝试了。我添加了对Class.forName的调用并且它有效。这是唯一改变的事情。

无论如何,我的问题是,有人知道为什么这有效或者这里发生了什么?我唯一的理论是我在hsqldb.jar中也有tomcat\lib用于另一个项目,也许某些方面司机感到困惑?但我的印象是,DriverManager应该能够自动判断使用哪个驱动程序,所以这不应该是一个问题...无论如何,如果有人能够告诉我这里发生了什么,我真的很感激它

1 个答案:

答案 0 :(得分:3)

JDBC4驱动程序包含一个文件:

META-INF/services/java.sql.Driver

在jar中,它使用ServiceProvider机制向JVM注册Driver实现(请参阅javadocs for java.util.ServiceLoader)。这就是为什么Class.forName不再需要的原因。

我的猜测是这是一个类加载器问题。 ServiceLoader javadoc提到:

  

必须可以从同一个类加载器访问提供程序   最初查询以找到配置文件;请注意这是   不一定是文件实际来自的类加载器   加载。

我会尝试将您的驱动程序放在tomcat\lib目录而不是您的Web应用程序目录中,看看是否有所不同(不同的类加载器?)。

如果您通过ide启动Web应用程序并设置断点,一旦达到断点,就可以使用" evaluate表达式"要执行的功能:ServiceLoader.load(Driver.class)。这将为您提供一个ServiceLoader课程,您可以查看该课程以查看哪些驱动程序已注册。您可以检查mysql驱动程序是否在那里,列表中的位置等等,这可能有助于弄清楚这里的行为。