有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

没有找到适合jdbc的驱动程序:derby:<dbname>在Linux/Ubuntu上使用Java DB的jdbc上出错

代码的基本部分:
(摘自《Java如何编程》第十版的例子,作者:保罗·德特尔,哈维·德特尔(第1063页))

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DisplayAuthors 
{
    public static void main(String args[])
    {
        final String DATABASE_URL = "jdbc:derby:books";

        try (  
                Connection connection =
                DriverManager.getConnection(DATABASE_URL, "user", "pass"); 
            )
        {
            // ...
        }
        catch (SQLException sqlException)                                
        {                                                                  
            sqlException.printStackTrace();
        }                                                   
    } 
}

我在Ubuntu 16.04上

虽然Java DB的Java网站说数据库包含在JDK中,但我有 经过几个小时的网络搜索,我们了解到 安装在Ubuntu上,不随java db提供

The website有这些有用的信息建议运行:

sudo apt-get install sun-javadb-client sun-javadb-core

产生错误,未安装

所以我下载了jdk-8u111-linux-x64。焦油gz是按照指示提取的,只是为了安全(我相信,我本可以将JAVA_HOME、DERBY_HOME设置为提取位置,它在ij部分(见下文)上“发挥了一半作用”),删除了我的/usr/lib/jvm/JAVA-8-openjdk-amd64/中的所有内容,并替换为我下载的内容

并在我的。bashrc:

JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
DERBY_HOME=/usr/lib/jvm/java-8-openjdk-amd64/db
export DERBY_HOME

在终端中输入以创建数据库并按照手册中的说明插入数据:

$JAVA_HOME/db/bin/ij
connect 'jdbc:derby:books;create=true;user=usr;password=pass';
run 'book-basic-table-create-and-insertions.sql';
exit;

它生成一个包含db info+/数据的图书文件

在。/还有一个名为derby的文件。包含以下信息的日志:

----------------------------------------------------------------
Wed Dec 14 19:01:58 EST 2016:
Booting Derby version The Apache Software Foundation - Apache Derby - 10.11.1.2 - (1629631): instance a816c00e-0158-ffc9-1471-000006d047c8 
on database directory /tmp/deleteme-IuI/books with class loader sun.misc.Launcher$AppClassLoader@6f94fa3e 
Loaded from file:/usr/lib/jvm/java-8-openjdk-amd64/db/lib/derby.jar
java.vendor=Oracle Corporation
java.runtime.version=1.8.0_111-b14
user.dir=/tmp/deleteme-IuI
os.name=Linux
os.arch=amd64
os.version=4.4.0-53-generic
derby.system.home=null
Database Class Loader started - derby.database.classpath=''
----------------------------------------------------------------
Wed Dec 14 19:04:25 EST 2016: Shutting down Derby engine
----------------------------------------------------------------
Wed Dec 14 19:04:27 EST 2016:
Shutting down instance a816c00e-0158-ffc9-1471-000006d047c8 on database directory /tmp/deleteme-IuI/books with class loader sun.misc.Launcher$AppClassLoader@6f94fa3e 
----------------------------------------------------------------

编译并运行:

javac DisplayAuthors.java # compiles without error
java DisplayAuthors

程序输出:

java.sql.SQLException: No suitable driver found for jdbc:derby:books
at java.sql.DriverManager.getConnection(DriverManagerager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.javaava:247)
at DisplayAuthors.main(DisplayAuthors.java:15)

我怎样才能让这个项目发挥作用


共 (1) 个答案

  1. # 1 楼答案

    您缺少代码的加载驱动程序部分

    例如

    String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    ...
    try {
        Class.forName(driver); 
    } catch(java.lang.ClassNotFoundException e) {
      ...
    }
    

    有关示例,请参见http://docs.oracle.com/javadb/10.8.3.0/getstart/rwwdactivity3.html

    编辑

    作为证明,我做了以下几点

    1. 在Eclipse中创建简单java项目
    2. 添加derby。罐子,德比网。jar&;德比客户机。jat到类路径

    我的代码

    public static void main(String[] args) {
    
        String driver = "org.apache.derby.jdbc.EmbeddedDriver";
        try {
            Class.forName(driver); 
        } catch(java.lang.ClassNotFoundException e) {
            e.printStackTrace();
        }
    
        final String DATABASE_URL = "jdbc:derby:myDB;create=true;user=user;password=pass";
    
        try (  
                Connection connection = DriverManager.getConnection(DATABASE_URL, "user", "pass"); 
            )
        {
            // ...
        }
        catch (SQLException sqlException)                                
        {                                                                  
            sqlException.printStackTrace();
        }        
    
    }
    

    这是毫无例外的