105

我正在尝试将启用数据库的 JSP 添加到现有的 Tomcat 5.5 应用程序(GeoServer 2.0.0,如果有帮助的话)。

该应用程序本身与 Postgres 对话很好,所以我知道数据库已启动,用户可以访问它,所有这些都是好东西。我正在尝试做的是我添加的 JSP 中的数据库查询。我已经使用了Tomcat 数据源示例中的配置示例,几乎是开箱即用的。必要的标记库位于正确的位置——如果我只有标记库引用,则不会发生错误,因此它正在查找那些 JAR。postgres jdbc 驱动程序 postgresql-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]
4

19 回答 19

122

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

这个异常基本上有两个原因:

#1。未加载 JDBC 驱动程序

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

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

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

.. 在您的代码中,在第一次调用之前DriverManager#getConnection()确保您不会吞下/忽略任何ClassNotFoundException可能被它抛出的东西并继续代码流,就好像没有发生任何异常一样。另请参阅我必须在哪里放置 Tomcat 连接池的 JDBC 驱动程序?

#2。或者,JDBC URL 的语法错误

您需要确保 JDBC URL 符合 JDBC 驱动程序文档并记住它通常区分大小写。当 JDBC URL 没有为任何已加载的驱动程序返回trueDriver#acceptsURL(),您也会得到这个异常。

如果是PostgreSQL,请在此处记录。

使用 JDBC,数据库由 URL(统一资源定位器)表示。对于 PostgreSQL™,这采用以下形式之一:

  • 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]...]

如果是Oracle,请在此处记录。

有 2 种 URL 语法,旧语法仅适用于 SID,新语法适用于 Oracle 服务名称。

旧语法jdbc:oracle:thin:@[HOST][:PORT]:SID

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


###也可以看看:

于 2009-12-16T00:28:33.570 回答
16

我忘记将 PostgreSQL JDBC 驱动程序添加到我的项目 ( Mvnrepository ) 中。

摇篮

// 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>

您还可以下载JAR并手动导入到您的项目中。

于 2018-07-17T14:25:50.880 回答
15
url="jdbc:postgresql//localhost:5432/mmas"

该网址看起来不对,您需要以下内容吗?

url="jdbc:postgresql://localhost:5432/mmas"
于 2009-12-15T23:56:44.200 回答
13

我遇到了类似的问题。我在上下文中的项目是动态 Web 项目(Java 8 + Tomcat 8),错误是针对 PostgreSQL 驱动程序异常:未找到合适的驱动程序

通过Class.forName("org.postgresql.Driver")在调用getConnection()方法之前添加解决了

这是我的示例代码:

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());
        }
于 2018-04-30T10:01:40.783 回答
3

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

确保首先加载驱动程序 Class.forName("org.postgresql.Driver"); 在你的代码中。

这是来自帖子 - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

jdbc 代码作为独立程序运行良好,但是在 TOMCAT 中它给出了错误 - “找不到合适的驱动程序”

于 2018-01-19T15:52:05.383 回答
1

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

Windows JAR 文件属性对话框
Windows JAR 文件属性对话框

于 2017-05-10T20:55:45.657 回答
1

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

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

drivers/mssql-jdbc-6.2.1.jre8.jar驱动程序文件的路径在哪里(例如SQL Server 的 JDBC)。

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

于 2019-07-30T16:06:59.193 回答
1

可能导致的一个非常愚蠢的错误是在 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";

(注意注视中没有空格,您可以在网址末尾留出空格,但不要这样做是安全的)

于 2019-04-20T07:44:48.203 回答
1

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

于 2017-06-29T16:07:24.560 回答
1

无论这个线程有多老,人们都会继续面临这个问题。

我的案例:我有最新的(在发布时)OpenJDK 和 maven 设置。我已经尝试了上面给出的所有方法,有/没有 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
  • 现在通过运行将director加载为模块
java --module-path com/mysql/jdbc -cp ./ App

这将手动加载(提取的)包,您的 java 程序将找到所需的 Driver 类。


  • 请注意,这是为mysql驱动程序完成的,其他驱动程序可能需要进行较小的更改。
  • 如果您的供应商提供.deb图像,您可以从/usr/share/java/your-vendor-file-here.jar
于 2020-10-17T08:59:09.363 回答
0

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

我的最终问题是我使用了不正确的 DataSource 类,因为我只是按照在线教程/示例进行操作。感谢戴维在这里对他自己的问题的评论找到了提示:Spring JDBC 无法加载 JDBC 驱动程序类 [oracle.jdbc.driver.OracleDriver]

后来还发现了带有 Oracle 特定驱动程序的 spring guru 示例: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;
    }
}

以及使用 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;
    }
}
于 2017-07-19T20:31:57.793 回答
0

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

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

但是我不想在生产中这样做,因为害怕干扰其他应用程序。明确定义驱动程序类为我解决了这个问题

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
于 2019-05-14T19:22:17.247 回答
0

就我而言,我正在使用 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;
    }
于 2020-05-26T19:42:01.267 回答
0

如果在某个地方没有为您的应用程序提供资源定义 - 很可能在中央 context.xml 或 conf/Catalina/localhost 中的单个上下文文件中,您将收到同样的错误。如果使用单独的上下文文件,请注意Tomcat 会在您删除/取消部署相应的 .war 文件时自由删除它们。

于 2020-09-18T21:40:46.627 回答
0

我使用的是 jruby,就我而言,我是在 config/initializers 下创建的

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'

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

于 2017-02-14T19:47:28.930 回答
0

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

    <dependency> 
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>9.4.0.jre11</version>
    </dependency>
于 2021-09-23T18:38:31.403 回答
0

概括:

  • Soln2(推荐)::

    • 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. Class.forName("com.mysql.cj.jdbc.Driver");在您的 Servlet Java 代码中使用。

Soln1 (Ori Ans) //-20220304

简而言之:

  1. 确保你有mysql-connector-java-8.0.28.jar文件在WEB-INF/lib
  2. 确保您使用Class.forName("com.mysql.cj.jdbc.Driver");

用于 jdbc 连接的 jar 和类


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

  • 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 => 它必须在里面WEB-INF/lib(我不知道为什么)

  • 1.4 使用版本mysql-connector-java-8.0.28.jar有效,EclipseMySQL JDBC Driver设置中只有 5.1 版本无所谓,忽略它。

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

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

    两者都有效,但Class.forName("com.mysql.jdbc.Driver");已弃用。

    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/ >

  • 如果要连接到 MySQL 数据库,可以使用名为 Connector/} 的 type-4 驱动程序,该驱动程序可从 MySQL 网站免费获得。但是,此驱动程序通常包含在 Tomcat 的 lib 目录中。因此,您通常不需要从 MySQL 站点下载此驱动程序。

    -- Murach 的 Java Servlet 和 JSP

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

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

    即使使用 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");在我的系统中使用,没有自动加载类。不知道为什么。 <(删除)请参阅下面的更新答案 soln2>

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

    我只需要直接添加mysql-connector-java-8.0.28.jarJava Build Path

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

    但是,如果我正在使用Dynamic Web Project(在这种情况下),则适用这两条严格的规则(jar 位置和类加载)。

    <参见TOMCAT ON ECLIPSE java.sql.SQLException: 找不到适合 jdbc:mysql 的驱动程序>


Soln2(更新答案)//-20220305_12

简而言之:

  • 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].)

将 jar 放入 Tomcat/lib


补充说明::

对于soln1::

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

这将创建一个警告:

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:

<请参阅Web 应用程序 [] 似乎已经启动了一个名为 [Abandoned connection cleanup thread] com.mysql.jdbc.AbandonedConnectionCleanupThread 的线程 >

这个答案让我找到了soln2。

对于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.

你可以忽略它。

<请参阅如何在 Tomcat 9.0.0M10 中修复“已扫描但未在其中找到 TLD 的 JAR” >

(你现在应该明白Murach’s Java Servlets and JSP在说什么了:jar in Tomcat/lib& the no need for Class.forName("com.mysql.cj.jdbc.Driver");

于 2022-03-05T04:30:57.393 回答
0

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

jdbc依赖

于 2021-02-27T05:04:45.517 回答
-2

我通过错误地将XML文件放入其中遇到了这个问题src/main/resources,我将其删除,然后一切恢复正常。

于 2019-03-26T02:57:43.967 回答