当前位置: 首页 > 知识库问答 >
问题:

Apache Derby via Gradle:没有为JDBC:Derby找到合适的驱动程序

栾昂雄
2023-03-14

我以前使用过Apache Derby,但从未在Gradle项目中使用过它。通过运行以下命令,我使用ijDerby工具在项目的根目录中创建了一个简单的Derby数据库:

connect 'jdbc:derby:MyDbTest;create=true';
CREATE TABLE Hashes (
string_id int,
RandString varchar(255)
);
INSERT INTO Hashes (string_id, RandString) values (1, 'sdfdsfsw');
SELECT * FROM Hashes;

在此之后,main.Java中的Java代码如下所示:

package com.company;

import java.io.File;
import java.sql.*;

public class Main {
    public static void main(String[] args) {
        System.out.println("Current working directory : "+ new File(".").getAbsolutePath());
        try {
            Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
        } catch (Exception e) {
            e.printStackTrace(); //Does not get executed!
        }
        Connection conn = null;
        try
        {
            conn = DriverManager.getConnection("jdbc:derby:MyDbTest"); //Exception here!!
            System.out.println("Connected to database MyDbTest");
            Statement s = conn.createStatement();
            ResultSet rs = s.executeQuery(
                    "select string_id, RandString from Hashes");
            while(rs.next()) {
                int string_id = rs.getInt("string_id");
                String randString = rs.getString("RandString");
                System.out.printf("string_id: %s, RandString: %s\n", string_id, randString);
            }
        }
        catch (SQLException sqle)
        {
            printSQLException(sqle);
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                    DriverManager.getConnection("jdbc:derby:;shutdown=true;deregister=false");
                }
            } catch (SQLException sqle) {
                printSQLException(sqle);
            }
        }
    }

    public static void printSQLException(SQLException e)
    {
        //According to this page:
        //https://db.apache.org/derby/papers/DerbyTut/embedded_intro.html
        //" A clean shutdown always throws SQL exception XJ015, which can be ignored."
        if(e.getSQLState().equals("XJ015")) return; //Ignore

        // Unwraps the entire exception chain to unveil the real cause of the
        // Exception.
        while (e != null)
        {
            System.err.println("\n----- SQLException -----");
            System.err.println("  SQL State:  " + e.getSQLState());
            System.err.println("  Error Code: " + e.getErrorCode());
            System.err.println("  Message:    " + e.getMessage());
            // for stack traces, refer to derby.log or uncomment this:
            e.printStackTrace(System.err);
            e = e.getNextException();
        }
    }
}

最初,我似乎能够加载ClientDriver,但是当我试图获得到数据库的连接时,我会得到异常。第一行确保当前工作目录是mydbtest数据库所在的项目的根目录。

apply plugin: 'java'
apply plugin:'application'
mainClassName = "com.company.Main"

repositories {
    mavenLocal()
    mavenCentral()
}
dependencies {
    compile group: 'org.apache.derby', name: 'derbyclient', version: '10.14.1.0'
    compile group: 'org.apache.derby', name: 'derbytools', version: '10.14.1.0'
    runtime group: 'org.apache.derby', name: 'derbyclient', version: '10.14.1.0'
    runtime group: 'org.apache.derby', name: 'derbytools', version: '10.14.1.0'
}
Current working directory : /Users/<myname>/Documents/sources/tempFive/.

----- SQLException -----
  SQL State:  08001
  Error Code: 0
  Message:    No suitable driver found for jdbc:derby:MyDbTest
java.sql.SQLException: No suitable driver found for jdbc:derby:MyDbTest
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)
    at com.company.Main.main(Main.java:25)

我以前使用过Apache Derby,我可以在没有Gradle的情况下使用这些代码。在对另一个问题的答复中提到的这一例外的两个原因是:

  • 驱动程序未加载。.-如果这是真的,那么为什么在我尝试加载ClientDriver的顶部没有异常(或者我应该尝试加载其他类来排除这种可能性。)
  • JDBC URL格式错误。-我在一个非分级项目中没有这个JDBC URL的问题,所以我不认为我的URL是错误的。如果这是不正确的,请纠正我。

我显然不知道我使用的是嵌入式驱动程序,而不是客户端驱动程序。当我在不使用Gradle的情况下使用这个文件时,我常常把整个Derby Lib目录中的所有jar都放在类路径中,而不用考虑什么被使用了,什么不被使用了。我的错。因此,首先要更改的是删除我的main()方法中的try catch:

try {
       Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
    } catch (Exception e) {
       e.printStackTrace(); //Does not get executed!
    }
apply plugin: 'java'
apply plugin:'application'
mainClassName = "com.company.Main"

repositories {
    mavenLocal()
    mavenCentral()
}
dependencies {
    compile group: 'org.apache.derby', name: 'derby', version: '10.14.1.0'
}

共有1个答案

蒙化
2023-03-14

您使用了错误的Derby驱动程序,通过使用derbyclient,您指定要使用Derby(网络)客户端驱动程序,该驱动程序支持以下URL:

jdbc:derby://server[:port]/databaseName[;URLAttributes=value[;...]]

您的URL不匹配,因此驱动程序拒绝它,最终java.sql.DriverManager将报告没有找到合适的驱动程序。

相反,您需要使用依赖项org.apache.Derby:Derby,因为您似乎希望使用Derby嵌入式驱动程序。这个驱动程序包含在完整的Derby包中,该包还包含Derby数据库本身,但不包含在DerbyClient中。此驱动程序支持URL格式:

jdbc:derby:databaseName;URLAttributes
 类似资料:
  • 当我创建kafka jdbc源连接器(debezium连接器用于带有confluent-5.4.0的oracle)时,出现错误“没有找到适合jdbc: oracle: oci…”。 我的oracle版本是企业版发布11.2.0.4.0-64位生产,我尝试了不同的驱动程序jar,但得到了相同的异常。 我的jdk版本是: 我已经将 debezium-连接器-预言机添加到文件夹融合-5.4.0/shar

  • 问题内容: 我是jdbc的初学者…运行此代码时遇到问题: 该代码使用appache derby,为了使其正常工作,我首先启动了derby服务器。 然后启动程序 我将类路径设置为C:\ Program Files \ Sun \ JavaDB \ lib \ derby.jar 而且我总是得到那个例外 java.sql.SQLException:找不到适用于jdbc:derby:// localho

  • 我正在使用JDBC接收器连接器尝试Kafka和Postgres接收器。 例外: 水槽特性: 我已经设置了< code > plugin . path =/usr/share/Java/Kafka-connect-JDBC /usr/share/java/kafka-connect-jdbc我有以下文件: , , 和其他一些基本上与汇合物一起打包的罐子。 然后我下载了 postgres-jdbc 驱

  • 试图连接到允许远程连接的免费mysql数据库主机,但我遇到了以下错误: 未找到适合jdbc的驱动程序:mysql://xx2-23-x1-2x1-172.compuxe-1.xmazonaws.com:3306 我使用下面的代码。 编辑 Stack Trace显示在下面:

  • 问题内容: 我在Netbeans中收到此错误: 这是怎么引起的,我该如何解决? 问题答案: 找不到适合jdbc:derby:// localhost:1527 /的驱动程序 此异常有两个原因: 驱动程序未加载。 JDBC URL格式错误。 对于你的情况,我希望在连接字符串的末尾看到一个数据库名称。例如(create=true如果要创建不存在的数据库,请使用): 默认情况下,数据库是在启动网络服务器

  • 我正在尝试使用以下代码将我的JavaMaven项目(在Jetty服务器上运行)连接到Google Cloud MySQL数据库: 我已经在pom中包含了这两个依赖项。xml: 我要走了 JAVAsql。SQLException:找不到适合jdbc的驱动程序:mysql://google... 我不知道该怎么办。我假设依赖项应该处理将JDBC驱动程序添加到我的类路径。