臭名昭著的 java.sql.SQLException: 找不到合适的驱动程序

我试图向现有的 Tomcat 5.5应用程序(GeoServer 2.0.0,如果有帮助的话)添加一个支持数据库的 JSP。

这个应用程序本身和 Postgres 交流的很好,所以我知道数据库已经建立起来了,用户可以访问它,所有的好东西。我要做的是在我添加的 JSP 中执行一个数据库查询。我已经在 Tomcat 数据源示例中使用了这个配置示例。所需的 taglib 都在正确的位置——如果只有 taglib 参考文献,就不会出现错误,所以它会找到那些 JAR。Postgres jdbc 驱动程序 postgreql-8.4.701.jdbc3.jar 位于 $CATALINA _ HOME/common/lib 中。

下面是 JSP 的顶部:

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>


<sql:query var="rs" dataSource="jdbc/mmas">
select current_validstart as ValidTime from runoff_forecast_valid_time
</sql:query>

来自 $CATALINA _ HOME/conf/server.xml 的相关部分,位于 <Host>内部,依次位于 <Engine>内部:

<Context path="/gs2" allowLinking="true">
<Resource name="jdbc/mmas" type="javax.sql.Datasource"
auth="Container" driverClassName="org.postgresql.Driver"
maxActive="100" maxIdle="30" maxWait="10000"
username="mmas" password="very_secure_yess_precious!"
url="jdbc:postgresql//localhost:5432/mmas" />
</Context>

这些行是 webapps/gs2/WEB-INF/web.xml 中标记的最后一行:

<resource-ref>
<description>
The database resource for the MMAS PostGIS database
</description>
<res-ref-name>
jdbc/mmas
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>

最后,还有一个例外:

   exception
org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
[...wads of ensuing goo elided]
228223 次浏览
url="jdbc:postgresql//localhost:5432/mmas"

这个 URL 看起来不对,您需要以下内容吗?

url="jdbc:postgresql://localhost:5432/mmas"

臭名昭著的 java.sql.SQLException: 找不到合适的驱动程序

这种异常可能基本上是由 引起的:

1. 未加载 JDBC 驱动程序

对于 雄猫,您需要确保将 JDBC 驱动程序放在服务器自己的 /lib文件夹中。

或者,当您实际上不使用服务器管理的连接池数据源,而是在 WAR 中手动处理 DriverManager#getConnection()时,那么您需要将 JDBC 驱动程序放在 WAR 的 /WEB-INF/lib中并执行。.

Class.forName("com.example.jdbc.Driver");

..在代码 before中的第一个 DriverManager#getConnection()调用,确保执行 没有吞噬/忽略任何可能被它抛出的 ClassNotFoundException,并继续代码流,就像没有发生异常一样。参见 我必须在哪里放置 Tomcat 的连接池的 JDBC 驱动程序?

其他服务器也有类似的放置 JAR 文件的方法:

  • GlassFish : 将 JAR 文件放在 /glassfish/lib
  • WildFly : 将 JAR 文件放在 /standalone/deployments

2. 或者,JDBC URL 语法错误

您需要确保 JDBC URL 符合 JDBC 驱动程序文档,并记住它通常是区分大小写的。如果对于任何加载的驱动程序,JDBC URL 都不返回 true for Driver#acceptsURL(),那么您也会得到这个异常。

PostgreSQL的情况下,它被记录为 给你

在 JDBC 中,数据库由一个 URL (统一资源定位符)表示。对于 PostgreSQLTM,它采用以下形式之一:

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

MySQL的情况下,它被记录为 给你

连接到 MySQL 服务器的 JDBC URL 的一般格式如下,方括号内的项目([ ])是可选的:

jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

神使的情况下,它被记录为 给你

There are 2 URL syntax, old syntax which will only work with SID and the new one with Oracle service name.

Old syntax jdbc:oracle:thin:@[HOST][:PORT]:SID

新语法 jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


参见:

我使用的是 jruby,在我的例子中,我是在 config/initializer 下创建的

Postgres _ Driver. rb

$CLASSPATH << '~/.rbenv/versions/jruby-1.7.17/lib/ruby/gems/shared/gems/jdbc-postgres-9.4.1200/lib/postgresql-9.4-1200.jdbc4.jar'

或者你的司机在哪里,就是这样!

值得注意的是,当 Windows 阻止它认为不安全的下载时,也会发生这种情况。可以通过右键单击 jar 文件(例如 ojdbc7.jar)并选中底部的“ Unblock”框来解决这个问题。

Windows JAR 文件属性对话框 :
Windows JAR File Properties Dialog

除了添加 MySQL JDBC 连接器之外,还要确保包含 DB 连接定义的 context.xml (如果没有在 Tomcat webapps 文件夹中解压缩的话)包含在 Tomcat conf 目录中。

当我在 STS 中开发 Spring Boot 应用程序,但最终将打包的 war 部署到 WebSphere (v. 9)时,我遇到了这个问题。基于以前的答案,我的情况是独一无二的。Jar 在我的 WEB-INF/lib 文件夹中,并且设置了 Parent Last 类加载集,但它总是说找不到合适的驱动程序。

我的最终问题是我使用了不正确的 DataSource 类,因为我只是在跟随在线教程/示例。感谢戴对自己问题的评论,在这里找到了提示: Spring JDBC Could not load JDBC driver class [oracle.jdbc.driver.OracleDriver]

后来还发现春季大师的例子与甲骨文特定的驱动程序: https://springframework.guru/configuring-spring-boot-for-oracle/

基于一般示例使用 org.springframework.jdbc.datasource.DriverManagerDataSource引发错误的示例。

@Config
@EnableTransactionManagement
public class appDataConfig {
\* Other Bean Defs *\
@Bean
public DataSource dataSource() {
// configure and return the necessary JDBC DataSource
DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@//HOST:PORT/SID", "user", "password");
dataSource.setSchema("MY_SCHEMA");
return dataSource;
}
}

And the corrected exapmle using a oracle.jdbc.pool.OracleDataSource:

@Config
@EnableTransactionManagement
public class appDataConfig {
/* Other Bean Defs */
@Bean
public DataSource dataSource() {
// configure and return the necessary JDBC DataSource
OracleDataSource datasource = null;
try {
datasource = new OracleDataSource();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


datasource.setURL("jdbc:oracle:thin:@//HOST:PORT/SID");
datasource.setUser("user");
datasource.setPassword("password");


return datasource;
}
}

我发现下面的提示很有帮助,可以在 Tomcat-中消除这个问题

确保首先在 Class.forName (”)中加载驱动程序 驱动程序”) ; 在您的代码中。

这是从后 https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Jdbc 代码作为一个独立的程序工作得很好,但是在 TOMCAT 中出现了一个错误——‘没有找到合适的驱动程序’

我也遇到过类似的问题。 我的项目在上下文中是动态 Web 项目(Java8 + Tomcat 8) ,错误是 PostgreSQL 驱动程序异常: < em > 没有找到合适的驱动程序

在调用 getConnection()方法之前加入 Class.forName("org.postgresql.Driver")解决了这个问题

Here is my Sample Code:

try {
Connection conn = null;
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/?preferQueryMode="
+ sql_auth,sql_user , sql_password);
} catch (Exception e) {
System.out.println("Failed to create JDBC db connection " + e.toString() + e.getMessage());
}

我忘记将 PostgreSQLJDBC 驱动程序添加到我的项目(Mvn 仓库)中。

格拉德尔 :

// http://mvnrepository.com/artifact/postgresql/postgresql
compile group: 'postgresql', name: 'postgresql', version: '9.0-801.jdbc4'

美芬 :

<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.0-801.jdbc4</version>
</dependency>

You can also 下载 the JAR and import to your project manually.

我遇到了这个问题,把一个 XML 文件到 src/main/resources错误,我删除了它,然后一切恢复正常。

一个可能导致的非常愚蠢的错误是在 JDBC URL 连接的开始添加空间。

我的意思是:-

假设您错误地将 jdbc 的 url 设置为

String jdbcUrl=" jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(请注意,在 url 的起始位置有一个空格,这将导致错误)

正确的方法应该是:

String jdbcUrl="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(注意凝视中没有空格,你可以在 url 的末尾留出空格,但是不留空格是安全的)

我在 mysql 数据源使用 Spring 数据时遇到了同样的问题,这些数据可以在外部工作,但是在 Tomcat 上部署时出现了这个错误。

当我将驱动程序 jar mysql-connect-java-8.0.16.jar 添加到 jres lib/ext 文件夹时,错误消失了

However I did not want to do this in production for fear of interfering with other applications. Explicity defining the driver class solved this issue for me

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver

使用指向驱动程序的 JAR 文件的 CLASSPATH环境变量运行 java,例如。

CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL

其中 drivers/mssql-jdbc-6.2.1.jre8.jar是驱动程序文件的路径(例如 用于 SQLServer 的 JDBC)。

ConnectURL是来自该驱动程序(samples/connections/ConnectURL.java)的示例应用程序,通过 javac ConnectURL.java编译。

在我的案例中,我与 Maven 一起工作在一个 Java 项目中,遇到了这个错误。 在 pom.xml 文件中,确保具有这种依赖关系

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
</dependencies>

你创建连接的地方有这样的东西

public Connection createConnection() {
try {
String url = "jdbc:mysql://localhost:3306/yourDatabaseName";
String username = "root"; //your my sql username here
String password = "1234"; //your mysql password here


Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(url, username, password);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}


return null;
}

如果没有为您的应用程序提供资源定义,您将得到同样的错误——很可能是在中央 context.xml 中,或者在 conf/Catalina/localhost 中的单个上下文文件中。如果使用单独的上下文文件,则 Tomcat 可以在删除/取消部署相应的上下文文件时自由删除它们。战争档案。

不管这个帖子有多老,人们还是会继续面对这个问题。

我的案例: 我有最新的(在发布的时候) OpenJDK 和 maven 设置。我已经尝试了上面给出的所有方法,在 StackOverflow 的姐妹文章中使用了/不使用专家甚至解决方案。我没有使用任何 IDE 或其他任何东西,只是在纯 CLI 中运行来演示核心逻辑。

这就是最终成功的方法。

  • 从官方网站下载驱动程序(对我来说是 MySQL https://www.mysql.com/products/connector/)。
  • 将给定的 jar 文件解压缩到与 java 项目相同的目录中。您将得到这样的目录结构。如果您仔细观察,就会发现这与我们使用 Class.forName(....)尝试做的事情完全相关。我们想要的文件是 com/mysql/jdbc/Driver.class

https://i.imgur.com/VgpwatQ.png

  • 编译包含代码的 java 程序。
javac App.java
  • 现在,通过运行
java --module-path com/mysql/jdbc -cp ./ App

This would load the (extracted) package manually, and your java program would find the required Driver class.


  • Note that this was done for the mysql driver, other drivers might require minor changes.
  • 如果供应商提供了 .deb映像,则可以从 /usr/share/java/your-vendor-file-here.jar获得 jar

对我来说,同样的错误发生在连接 postgres 时,创建一个数据框架从表。这是由于,缺少依赖性。未设置 jdbc 依赖项。我在构建中使用了 maven,因此将所需的依赖项从 专家依赖添加到 pom 文件中

Jdbc 依赖性

对于我来说,添加下面的依赖到 pom.xml 文件刚刚解决了像魔术!我没有 mysql 连接器依赖项,甚至添加 mssql jdbc jar 文件来构建路径也不起作用。

    <dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.4.0.jre11</version>
</dependency>

摘要:

  • 索伦2(推荐) :

    • 1. 将 mysql-connector-java-8.0.28.jar文件放入 <where you install your Tomcat>/lib
  • 索恩1:

    • 1. 将 mysql-connector-java-8.0.28.jar文件放入 WEB-INF/lib
    • 2. 在 Servlet Java 代码中使用 Class.forName("com.mysql.cj.jdbc.Driver");

Soln1 (Ori Ans) < sup > < sub > < sup > < sub >//-20220304

简而言之:

  1. 确保在 WEB-INF/lib中有 mysql-connector-java-8.0.28.jar文件
  2. make sure you use the Class.forName("com.mysql.cj.jdbc.Driver");

jar & class for jdbc connect


附加说明(不重要) ,基于我的尝试(可能是错误的) :

  • 1.1将罐子直接放入 Java build path不起作用

  • 1.2. 将罐子放入 Data management > Driver Def > MySQL JDBC Driver > then add it as library to Java Build path不起作用。

  • 1.3 => it has to be inside the WEB-INF/lib (I dont know why)

  • 1.4使用版本 mysql-connector-java-8.0.28.jar工作,只有版本5.1在 Eclipse MySQL JDBC Driver设置没有问题,忽略它。

    < 请参阅 如何使用 Eclipse 数据库管理透视图连接到 MySql 8.0数据库 >

  •     Class.forName("com.mysql.cj.jdbc.Driver");
    Class.forName("com.mysql.jdbc.Driver");
    

    都有效, but the Class.forName("com.mysql.jdbc.Driver"); is deprecated.

    Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
    

    < 请参阅 https://www.yawintutor.com/no-suitable-driver-found-for-jdbcmysql-localhost3306-testdb/ >

  • If you want to connect to a MySQL database, you can use the type-4 driver named Connector/} that's available for free from the MySQL website. However, this driver is typically included in Tomcat's lib directory. As a result, you don't usually need to download this driver from the MySQL site.

    —— Murach 的 Java Servlet 和 JSP

    我在 Tomcat 中找不到作者所说的驱动程序,我需要使用 mysql-connector-java-8.0.28.jar < (删除)见下面更新的答案 soln2 >

  • 但是,如果使用的是旧版本的 Java,则需要使用 Class 类的 forName 方法在调用 getConnection 方法之前显式加载驱动程序

    即使使用 JDBC 4.0,您有时也会收到一条消息,“没有找到合适的驱动程序”在这种情况下,可以使用 Class 类的 forName 方法显式加载驱动程序。但是,如果自动驱动程序加载工作,则从代码中删除此方法调用通常是有意义的。

    如何在 JDBC 4.0之前加载 MySQL 数据库驱动程序

    Class.forName{"com.mysql.jdbc.Driver");

    —— Murach 的 Java Servlet 和 JSP

    我必须在我的系统中使用 Class.forName("com.mysql.cj.jdbc.Driver");,没有自动加载类。不知道为什么。 <(striked-out) see updated answer soln2 below>

  • 当我在 Eclipse 中使用 normal Java Project而不是 Dynamic Web Project时,

    我只需要把 mysql-connector-java-8.0.28.jar直接加到 Java Build Path上,

    然后我就可以毫无问题地连接到 JDBC 了。

    但是,如果我使用的是 Dynamic Web Project(在本例中就是 Dynamic Web Project) ,那么这两条严格的规则就适用(jar 位置和类加载)。

    < 请参阅 SQLException: 找不到适合 jdbc: mysql 的驱动程序 >


Soln2(更新 Ans) < sup > < sub > < sup > < sub > < sup >//-20220305 _ 12

In short:

  • 1. 将 mysql-connector-java-8.0.28.jar文件放入 <where you install your Tomcat>/lib

    例句: G:\pla\Java\apache-tomcat-10.0.16\lib\mysql-connector-java-8.0.28.jar

    (对于 Eclipse Dynamic Web Project,jar 将自动放入项目的 Java build path > Server Runtime [Apache Tomcat v10.0]中。)

put jar in Tomcat/lib


附加说明:

第一季,第1集:

  1. put mysql-connector-java-8.0.28.jar file in the WEB-INF/lib.
  2. use Class.forName("com.mysql.cj.jdbc.Driver"); in your Servlet Java code.

这将产生一个警告:

WARNING: The web application [LearnJDBC] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:

<see Web 应用程序[]似乎已经启动了一个名为[废弃的连接清理线程] com.mysql.jdbc. AbandonedConnectionCleanupThread 的线程 >

这个答案让我找到了 Soln2。

第二天:

    1. mysql-connector-java-8.0.28.jar文件放入 <where you install your Tomcat>/lib

    这将创建一个信息:

    INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    
  • 你可以无视它。

    < 请参阅 如何修复 Tomcat9.0.0 M10中“扫描了但没有发现 TLD 的 JAR” >

  • (你现在应该明白 Murach’s Java Servlets and JSP说的是什么: Tomcat/lib中的罐子和不需要 Class.forName("com.mysql.cj.jdbc.Driver");)

  • 来修复它

    Tomcat 8.5. 在/conf 目录集中的 catalina.properties 内部: tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\*.jar

    How to fix JSP compiler warning: one JAR was scanned for TLDs yet contained no TLDs?

    skip scan in Tomcat/lib jar

我也遇到了同样的错误。在我的例子中,JDBC URL 是正确的,但问题出在 classpath上。但是,将 MySQL 连接器的 JAR 文件添加到 -classpath-cp(或者在 IDE 的情况下,作为库)也不能解决问题。我必须将 JAR 文件移动到 Java 字节码的位置,并运行 java -cp :mysql_connector.jar才能完成这项工作。我把这个留在这里以防有人遇到和我一样的问题。

faced same issue. in my case ':' colon before '//' (jdbc:mysql://localhost:3306/dbname) was missing, and it just fixed the problem. 确保: 及//放置妥当。