java - mysql-connector 8.0需要通过 `Class.forName()`注册驱动程序吗?

标签 java servlets jdbc mysql-8.0

我已经知道从 JDBC 4.0.JDK 6 开始,在类路径中找到的驱动程序会自动加载。这就是我们在创建 JDBC 连接时习惯忽略 Class.forName(dbDriver); 代码行的原因。

但最近我安装了MySQL Server 8.0.11,并在运行于<上的简单Servlet项目中将驱动程序更新为mysql-connector-java:8.0.11 tomcat 8.5.30。但这给了我臭名昭著的异常(exception)

java.sql.SQLException: No suitable driver found for 
jdbc:mysql://localhost:3306/mysql at ...

但是我的所有代码之前都工作正常。然后我添加了 Class.forName("com.mysql.jdbc.Driver");

而且它有效。我想我没有错过任何事情。谁能给我解释一下这可能是什么原因?

最佳答案

仅当驱动程序 jar 位于应用程序的初始(系统)类路径上时,JDBC 4.0(及更高版本)自动驱动程序加载才起作用。如果您使用 Tomcat,驱动程序必须位于 <catalina-home>/lib 中文件夹。

如果您将驱动程序与应用程序一起部署,则驱动程序位于该特定应用程序的上下文类路径上,并且需要使用 Class.forName 显式加载它。 .

但实际上,您不应该使用 DriverManager.getConnection在 Web 应用程序中创建连接。您应该使用数据源(最好使用连接池),该数据源可以在代码中创建和初始化,也可以在 Tomcat 的上下文或服务器配置中创建和初始化。在这种情况下,这个问题甚至不会出现,因为要么数据源已经知道如何获取驱动程序,要么您必须使用驱动程序显式配置它才能使用。

关于java - mysql-connector 8.0需要通过 `Class.forName()`注册驱动程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50433645/

相关文章:

java - Android中如何设置播放歌曲的持续时间?

java - 单个大型 Web 应用程序还是多个小型 Web 应用程序?

Java servlet 上传新文件到服务器

java - 如何从 Mac 上的 Java 连接到 MS Access 2007

java - 在 Eclipse 中控制编译器选项

java - Vaadin Spring 作用域对象 : is it possible to create a Vaadin unit test without starting up a servlet container?

java - 正则表达式匹配所有不以数字开头的单词

jsp - 如何在 Windows tomcat 中部署在 RHEL 5 中制作的 java tomcat 项目?

java - 使用 ResultSet 返回最后生成的键

java - Cassandra 有线协议(protocol)中的 ProtocolID 为 'duration'?