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

Sha*_*mud 1 java servlets jdbc mysql-8.0

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

但最近我安装了MySQL Server 8.0.11并将驱动程序更新到 在tomcat 8.5.30mysql-connector-java:8.0.11上运行的简单 Servlet 项目中。但这给了我臭名昭著的例外

java.sql.SQLException: No suitable driver found for 
jdbc:mysql://localhost:3306/mysql at ...
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*eel 5

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

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

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