臭名昭著的java.sql.SQLException: No suitable driver found

128

我正在尝试将一个带有数据库功能的JSP添加到现有的Tomcat 5.5应用程序中(如果有帮助,应用名为GeoServer 2.0.0)。

该应用程序本身可以很好地访问Postgres数据库,所以我知道数据库是可用的,用户可以访问它,所有操作都正常。我正在尝试在我添加的JSP中进行数据库查询。我基本上直接使用了Tomcat datasource示例中的配置示例。必需的taglibs放置在正确的位置 - 如果只使用taglib引用,则不会出现任何错误,因此它能够找到这些JARs。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 中的相关部分,位于 <Engine> 内的 <Host> 中:

<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文件的</taglib>标签中的最后一行:

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

请查看我的回答:https://dev59.com/XW035IYBdhLWcg3wNdPg#38656446 - Pacerier
22个回答

1

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


0

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

我的最终问题是我使用了错误的DataSource类,因为我只是按照在线教程/示例进行操作。通过David Dai在他自己的问题Spring JDBC Could not load JDBC driver class [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;
    }
}

并使用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;
    }
}

0
对我来说,只需将以下依赖项添加到pom.xml文件中,问题就像魔术般地解决了!我没有mysql连接器依赖项,即使将mssql jdbc jar文件添加到构建路径也不起作用。
    <dependency> 
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>9.4.0.jre11</version>
    </dependency>

1
仅添加这个不会在运行时提供所需的依赖项。您仍需要一个 shaded JAR 或手动将驱动程序添加到类路径中,以使其在运行时可用。 - OneCricketeer

0

我在使用Spring Data时遇到了与mysql数据源相同的问题,它可以在外部工作,但在部署到Tomcat上时会出现错误。

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

然而,我不想在生产环境中这样做,因为担心会干扰其他应用程序。明确定义驱动程序类解决了我的问题。

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

0
如果您的应用程序中没有提供资源定义,那么您将会得到同样的错误 -- 最有可能是在中央 context.xml 或者 conf/Catalina/localhost 中的个人 context 文件中。如果使用个人 context 文件,请注意 Tomcat 会在您删除/卸载相应的 .war 文件时自由删除它们。

0

我遇到了同样的错误。在我的情况下,JDBC URL 是正确的,但问题出在classpath上。然而,将 MySQL 连接器的 JAR 文件添加到 -classpath-cp(或者在 IDE 的情况下作为库)并不能解决问题。所以我必须将 JAR 文件移动到 Java 字节码的位置,并运行 java -cp :mysql_connector.jar 以使其正常工作。如果有人遇到和我一样的问题,我在这里留下了这个信息。


0
遇到了相同的问题。在我的情况下,'//'之前的':'冒号(jdbc:mysql://localhost:3306/dbname)丢失了,只需修复该问题即可。 确保正确放置':'和'//'。

0

在我从表格创建数据框时连接到Postgres时,出现了同样的错误。这是由于缺少依赖项引起的。JDBC依赖项未设置。我使用Maven进行构建,因此从Maven依赖中添加所需的依赖项到pom文件中。

JDBC依赖


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;
    }

1
你不应该需要调用 Class.forNameDriverManager 应该能够找到它。 - Stephen C
你可能是正确的。Java 不是我的主要编程语言。 - Gabriel Arghire

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'

或者无论您的驱动程序在哪里,就是这样!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接