根据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应该能够自动判断使用哪个驱动程序,所以这不应该是一个问题...无论如何,如果有人能够告诉我这里发生了什么,我真的很感激它
答案 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驱动程序是否在那里,列表中的位置等等,这可能有助于弄清楚这里的行为。