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

zf9nrax1  于 2021-06-30  发布在  Java
关注(0)|答案(16)|浏览(510)

我正在尝试向现有的tomcat5.5应用程序(geoserver2.0.0,如果有帮助的话)添加一个支持数据库的jsp。
应用程序本身和postgres的对话很好,所以我知道数据库已经启动,用户可以访问它,所有这些好东西。我要做的是在jsp中添加一个数据库查询。我在tomcat数据源示例中使用了配置示例。必要的taglib放在正确的位置——只要有taglib ref,就不会出错,所以它正在查找那些jar。postgresjdbc驱动程序postgresql-8.4.701.jdbc3.jar位于$catalina\u 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\u 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]
dly7yett

dly7yett1#

我在mysql数据源使用spring数据时遇到了同样的问题,spring数据可以在外部工作,但是在tomcat上部署时出现了这个错误。
当我将驱动程序jar mysql-connector-java-8.0.16.jar添加到jres lib/ext文件夹时,错误消失了
但是,我不想在生产中这样做,因为我担心会干扰其他应用程序。明确定义驱动程序类为我解决了这个问题

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

6za6bjd02#

我使用的是jruby,在我的例子中,我是在config/initializers下创建的
postgres\u驱动程序.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'

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

eiee3dmh

eiee3dmh3#

除了添加mysql jdbc连接器之外,还要确保context.xml(如果没有在tomcatwebapps文件夹中解包)以及db连接定义都包含在tomcats conf目录中。

lp0sw83n

lp0sw83n4#

我忘了将postgresqljdbc驱动程序添加到我的项目(mvnrepository)中。
grad尔:

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

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

dzhpxtsq

dzhpxtsq5#

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

这个网址看起来不对,你需要以下信息吗?

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

wbrvyc0a6#

javaCLASSPATH 指向驱动程序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 .

gt0wga4j

gt0wga4j7#

不管这条线有多旧,人们都会继续面对这个问题。
我的案例:我有最新的(发布时)openjdk和maven设置。我已经尝试了上面给出的所有方法,有/没有maven,甚至在stackoverflow的姐妹帖子上也有解决方案。我没有使用任何ide或其他任何东西,从裸cli运行只是为了演示核心逻辑。
以下是最终奏效的方法。
从官方网站下载驱动程序(对我来说是mysqlhttps://www.mysql.com/products/connector/). 用你的口味。
将给定的jar文件解压缩到与java项目相同的目录中。你会得到这样的目录结构。如果你仔细看的话,这与我们使用 Class.forName(....) . 我们想要的文件是 com/mysql/jdbc/Driver.class
编译包含代码的java程序。

javac App.java

现在通过运行

java --module-path com/mysql/jdbc -cp ./ App

这将手动加载(提取的)包,java程序将找到所需的驱动程序类。
请注意,这是为 mysql 驱动程序,其他驱动程序可能需要轻微更改。
如果您的供应商提供 .deb 图像,你可以从 /usr/share/java/your-vendor-file-here.jar

9rnv2umw

9rnv2umw8#

我也面临着类似的问题。我在上下文中的项目是动态web项目(java8+tomcat8),错误是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());
        }
2izufjch

2izufjch9#

在我的例子中,我使用maven处理java项目时遇到了这个错误。在pom.xml文件中,确保您具有此依赖项

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <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;
    }
8cdiaqws

8cdiaqws10#

我在sts中开发spring引导应用程序时遇到了这个问题,但最终将打包的war部署到websphere(v.9)。根据以前的回答,我的处境是独一无二的。ojdbc8.jar在我的webinf/lib文件夹中,父类设置为last class loading,但它总是说找不到合适的驱动程序。
我的最终问题是我使用了不正确的datasource类,因为我只是跟随在线教程/示例。感谢david dai在这里对自己的问题的评论:springjdbc无法加载jdbc驱动程序类[oracle.jdbc.driver.oracledriver]
后来还发现了spring guru使用oracle特定驱动程序的示例: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;
    }
}
jpfvwuh4

jpfvwuh411#

臭名昭著的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不返回时 true 为了 Driver#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]...] 在甲骨文的情况下,它是记录在这里。
有两种url语法,旧语法只适用于sid,新语法适用于oracle服务名。
旧语法 jdbc:oracle:thin:@[HOST][:PORT]:SID 新语法 jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE ####另请参见:
我必须在哪里放置tomcat连接池的jdbc驱动程序?
如何在eclipse web项目中安装jdbc驱动程序而不面对java.lang.classnotfoundexception
在基于servlet的应用程序中,我应该如何连接到jdbc数据库/数据源?
“class.forname()”和“class.forname().newinstance()”有什么区别?
将java连接到mysql数据库

vbkedwbf

vbkedwbf12#

我发现下面的技巧很有用,可以消除tomcat中的这个问题-
确保先加载一个class.forname(“org.postgresql.driver”)驱动程序;在你的代码里。
这是从邮局发来的-https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com
jdbc代码作为一个独立的程序运行得很好,但是在tomcat中它给出了一个错误-“找不到合适的驱动程序”

7xllpg7q

7xllpg7q13#

如果没有为应用程序提供资源定义(很可能是在central context.xml中,或者conf/catalina/localhost中的单个上下文文件中),则会出现相同的错误。如果使用单独的上下文文件,请注意,每当您删除/取消部署相应的.war文件时,tomcat都会自由地删除它们。

vi4fp9gy

vi4fp9gy14#

值得注意的是,当windows阻止它认为不安全的下载时,也可能发生这种情况。这可以通过右键单击jar文件(比如ojdbc7.jar)并选中底部的“unblock”框来解决。
windows jar文件属性对话框:

g6baxovj

g6baxovj15#

我通过将xml文件放入 src/main/resources 错了,我删除了它,然后一切恢复正常。

相关问题