臭名昭著的 java.sql.SQLException: 找不到合适的驱动程序
这个异常基本上可以有two causes:
1. JDBC驱动未加载
的情况下Tomcat,需要保证JDBC驱动放在服务器自己的/lib
folder.
其他服务器也有类似的放置 JAR 文件的方式:
-
玻璃鱼: 将JAR文件放入
/glassfish/lib
-
WildFly: 将JAR文件放入
/standalone/deployments
或者,当你actually不使用服务器管理的连接池数据源,例如您通过JNDI获取@Resource
或者在JPA中配置persistence.xml
,但是当你手动摆弄时DriverManager#getConnection() https://docs.oracle.com/en/java/javase/20/docs/api/java.sql/java/sql/DriverManager.html#getConnection(java.lang.String)WAR 中自定义类中的低级方式,那么您需要将 JDBC 驱动程序放在 WAR 中/WEB-INF/lib
并执行..
Class.forName("com.example.jdbc.Driver");
..在您的自定义代码中before首先DriverManager#getConnection()
致电,确保您这样做not吞下/忽略任何ClassNotFoundException
它可以抛出它并继续代码流,就好像没有发生任何异常一样。也可以看看我必须将 Tomcat 连接池的 JDBC 驱动程序放置在哪里? https://stackoverflow.com/questions/13161747/where-do-i-have-to-place-the-jdbc-driver-for-tomcats-connection-pool and 向与数据库交互的 Servlet 提交表单会导致空白页面 https://stackoverflow.com/questions/6044204/submitting-form-to-servlet-which-interacts-with-database-results-in-blank-page/6044337#6044337.
2. 或者,JDBC URL 语法错误
您需要确保指定的 JDBC URL 符合 JDBC 驱动程序文档,并记住它通常区分大小写。当 JDBC URL 未返回时true
for Driver#acceptsURL() https://docs.oracle.com/en/java/javase/20/docs/api/java.sql/java/sql/Driver.html#acceptsURL(java.lang.String)对于任何加载的驱动程序,那么您也将得到这个异常。
的情况下PostgreSQL它被记录在案here https://jdbc.postgresql.org/documentation/use/#connecting-to-the-database.
使用 JDBC,数据库由 URL(统一资源定位器)表示。对于 PostgreSQL®,这采用以下形式之一:
jdbc:postgresql:database
jdbc:postgresql:/
jdbc:postgresql://host/database
jdbc:postgresql://host/
jdbc:postgresql://host:port/database
jdbc:postgresql://host:port/
的情况下MySQL它被记录在案here https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-jdbc-url-format.html.
这是连接 URL 的通用格式:
protocol//[hosts][/database][?properties]
这是一个简单的单主机连接 URL 的示例:
jdbc:mysql://host1:33060/sakila
的情况下Oracle它被记录在案here https://www.orafaq.com/wiki/JDBC.
Thin 驱动程序为所有这些驱动程序提供了以下类型的 URL 格式:
SID(Oracle不再推荐使用):
jdbc:oracle:thin:[<user>/<password>]@<host>[:<port>]:<SID>
服务:
jdbc:oracle:thin:[<user>/<password>]@//<host>[:<port>]/<service>
TNS 名称:
jdbc:oracle:thin:[<user>/<password>]@<TNSName>
也可以看看:
- 我必须将 Tomcat 连接池的 JDBC 驱动程序放置在哪里? https://stackoverflow.com/questions/13161747/where-do-i-have-to-place-the-jdbc-driver-for-tomcats-connection-pool
- 如何在Eclipse Web项目中安装JDBC驱动程序而不面临java.lang.ClassNotFoundException https://stackoverflow.com/questions/2353141/how-to-install-mysql-jdbc-driver-in-eclipse-web-project-without-java-lang-classn
- 我应该如何在基于 servlet 的应用程序中连接到 JDBC 数据库/数据源? https://stackoverflow.com/questions/2299469/how-should-i-connect-to-a-mysql-data-source-in-a-servlet-based-application
- “Class.forName()”和“Class.forName().newInstance()”有什么区别? https://stackoverflow.com/questions/2092659/what-is-the-difference-between-class-forname-and-class-forname-newinstanc/2093236#2093236
- 将 Java 连接到 MySQL 数据库 https://stackoverflow.com/questions/2839321/connect-java-to-a-mysql-database/2840358#2840358