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

问题描述 投票:63回答:12

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

该应用程序本身与Postgres谈话很好,所以我知道数据库已启动,用户可以访问它,所有这些好东西。我想要做的是在我添加的JSP中的数据库查询。我在 Tomcat datasource example中使用了配置示例,开箱即用。必要的taglibs位于正确的位置 - 如果我只有taglib refs就不会发生错误,因此它会找到那些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]
postgresql tomcat jdbc geoserver
12个回答
91
投票

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

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

1. JDBC driver is not loaded

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

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

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

..在你的第一个DriverManager#getConnection()调用之前的代码中,你确保你不会吞下/忽略任何可以被它抛出的ClassNotFoundException并继续代码流,好像什么也没发生异常。另见Where do I have to place the JDBC driver for Tomcat's connection pool?

2. Or, JDBC URL is in wrong syntax

您需要确保JDBC URL符合JDBC驱动程序文档,并记住它通常区分大小写。如果JDBC URL没有为任何加载的驱动程序返回trueDriver#acceptsURL(),那么您也将获得此异常。

在PostgreSQL的情况下,它被记录为here

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

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

在MySQL的情况下,它记录了here

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

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

在Oracle的情况下,它被记录为here

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

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

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


See also:


0
投票

我通过错误地将一个XML文件放入@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
投票

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

我的意思是:-

假设你有jdbc url喜欢的错误

src/main/resources

(注意,在网址的凝视中有一个空格,这会产生错误)

正确的方法应该是:

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

(注意在凝视中没有空间,你可以在网址末尾给出空格,但不安全)


0
投票

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

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

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

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

15
投票
url="jdbc:postgresql//localhost:5432/mmas"

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

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

7
投票

我遇到了类似的问题。上下文中的项目是Dynamic Web Project(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());
        }

5
投票

我忘了将PostgreSQL JDBC Driver添加到项目Mvnrepository中。

摇篮:

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

Maven的:

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

您也可以download JAR并手动导入您的项目。


3
投票

我发现以下内容对Tomcat中消除此问题很有帮助 -

一定要先加载驱动程序,然后再运行Class.forName(“org.postgresql.Driver”);在你的代码中。

这是来自后https://www.postgresql.org/message-id/[email protected]

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


1
投票

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

Windows JAR文件属性对话框:


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'

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


0
投票

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


0
投票

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

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

后来发现了Spring特例驱动程序的例子: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;
    }
}

使用qazxsw poi的正确示例:

oracle.jdbc.pool.OracleDataSource
© www.soinside.com 2019 - 2024. All rights reserved.