【问题标题】:Setting up an embedded Derby database in a standalone Java application在独立 Java 应用程序中设置嵌入式 Derby 数据库
【发布时间】:2025-12-31 00:10:11
【问题描述】:

我正在尝试为独立的 Java 应用程序设置一个嵌入式 Derby 数据库,但是在翻阅了各种文档之后,我似乎找不到任何简单的解释或示例。我正在使用带有 Derby 插件的 Eclipse,并为我的项目启用了 Derby 特性。

我在standalone address book 中找到了使用嵌入式 Derby 数据库的示例以及在 Eclipse 中使用 Derby 的概述(似乎没有涵盖嵌入式部署),但我仍然觉得我错过了一些基本的东西。

这是我第一次尝试在 Java 中使用数据库,我有点困惑,所以这里是我的基本问题:

  • Java 如何与 Derby 数据库(在嵌入式部署中)交互的基本理念(或模型)是什么?是否要遵循它们的重要设计模式?
  • 我是否需要在类中创建某种类型的数据库构造函数(包括表结构等),还是全部使用其他工具完成?
  • 创建并保存了一个数据库,如何“启动”它?实际的数据库保存在哪里?

代码片段会很有帮助!

【问题讨论】:

标签: java embedded-database javadb derby


【解决方案1】:

如果您可以切换到 netbeans IDE,这里有两个有用的教程,我可以在 ide 中使用它们(安装程序有一些小问题)。它使用了 JPA,这是一种简化了很多数据库交互的抽象。

https://blogs.oracle.com/geertjan/entry/embedded_database_for_netbeans_platform

http://platform.netbeans.org/tutorials/nbm-crud.html

解决您的一些问题:

  1. 如果您使用 java 和关系数据库,我强烈推荐 JPA。否则,您将使用 JDBC 与您的数据库进行交互,并且 使用 SQL。
  2. 传统上,您使用实用程序或运行脚本来 但是,创建表模式,因为您要嵌入您 可能有兴趣(就像我一样)让数据库和模式创建它 self 动态,因此您不必每次都运行此脚本 安装您的应用程序。这对于 derby 的嵌入式 JPA 是可行的 本教程涵盖的配置。
  3. 如果您正在运行 嵌入式 derby 数据库没有单独的线程或套接字 你启动。您的应用程序将使用 jpa 或 derby api,它们将使用 文件锁定以访问 derby 文件。在我的定义中,嵌入式 数据库没有单独的线程或进程侦听套接字 处理多个请求。

希望这会有所帮助,祝你好运!

【讨论】:

    【解决方案2】:

    那些博客 n url 非常棒,但我建议将 OP 切换到 NetBeans,即使我使用了 d ClientDriver 版本的 Java Derby 驱动程序,并且我创建了一个类或方法来在启动时自动启动数据库这样我在运行时就不会遇到任何SQLException 并且它一直在工作。虽然我确实使用NetworkServerControl 类在运行时启动我的数据库,就像 diz

    NetworkServerControl server=new NetworkServerControl(InetAddress.getLocalHost(),1527);
    server.start (null);
    //Class.forName n DriverManager.getConnection() declarations goes here. 
    

    【讨论】:

    • 呃,什么?喜欢更改 NetBeans IDE?鉴于这与他的实际问题几乎完全相切,并且无论如何都可能无法解决......
    【解决方案3】:

    我建议您使用一个名为 ConnectionDerby 的类,将所有逻辑和参数放在 Select、insert、update、Delete 中,作为嵌入式数据库,如果数据库已经存在,我会反对,如果不存在,我会创建,我希望这段代码对你有帮助,对不起或者我的英语,我是在 java 中使用这个数据库的新手,但我希望这能帮助你理解....

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import javax.swing.JOptionPane;
    
    public class ConnectionDerby {
    
        private Connection conn = null;
        private Statement sttm = null;
    
        public Connection CrearBD(String query) {
        try {
            //Obtenemos el Driver de Derby
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            conn = DriverManager.getConnection("jdbc:derby:.\\BD\\nombrebasededatos.db;create=true");
            if (conn != null) {
                //JOptionPane.showMessageDialog(null, "Base de Datos Lista");
                try {
                    PreparedStatement pstm = conn.prepareStatement(query);
                    pstm.execute();
                    pstm.close();
                    //JOptionPane.showMessageDialog(null, "Base de Datos Creada Correctamente");
                    System.out.println("SENTENCIA SQL EFECTUADA CORRECTAMENTE");
                } catch (SQLException ex) {
                    //JOptionPane.showMessageDialog(null, ex.getLocalizedMessage());
                    System.out.println(ex.getMessage());
                    JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
                    //JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL");
                }
            }
    
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN EJECUTAR LAS SENTENCIAS SQL parte 2");
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
            JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
            //JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN EJECUTAR LAS SENTENCIAS SQL parte 3");
        }
        return conn;
    }
    
    public Connection AccederBD() {
        try {
            //Obtenemos el Driver de Derby
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            //Obtenemos la Conexión
            conn = DriverManager.getConnection("jdbc:derby:.\\BD\\nombrebasededatos.db");
            if (conn != null) {
                System.out.println("Base de Datos Ya Leida Correctamente");
                //JOptionPane.showMessageDialog(null, "Base de Datos Ya Leida Correctamente");
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            System.out.println("Sistema Creado por Mario José Echeverría");
            System.out.println("NO SE ENCONTRO LA BASE DE DATOS");
            System.out.println("CREANDO BASE DE DATOS EN DERBY DATABASE");
            String createTableProyecto = "Sentence to create first table";
            String createTablePrimer = "Sentence to create second table";
            String createTableTopCoat = "Sentence to create third table";
            String createTableCotizacion = "Sentence to create fourth table";
            CrearBD(createTableProyecto);
            CrearBD(createTablePrimer);
            CrearBD(createTableTopCoat);
            CrearBD(createTableCotizacion);
            //*************PRUEBAS*****************
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
            System.out.println("ERROR DE TIPO ClassNotFoundException");
            //JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN ACCEDER A LA BASE DE DATOS parte 2");
        }
        return conn;
    }
    
    public void UID(String sqlcad) {
        try {
            //Obtenemos el Driver de Derby
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            conn = DriverManager.getConnection("jdbc:derby:.\\BD\\nombrebasededatos.db");
            sttm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            sttm.executeUpdate(sqlcad);
            System.out.println("Conexión Exitosa a la Base de Datos");
            //JOptionPane.showMessageDialog(null, "Conexión exitosa");
            sttm.close();
            conn.close();
            if (conn != null) {
                System.out.println("Consulta Realizada Correctamente");
                //JOptionPane.showMessageDialog(null, "Base de Datos Ya Leida Correctamente");
            }
        } catch (SQLException e) {
            System.out.println("Error= " + e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println("Error= " + e.getMessage());
        }
    }
    
    public ResultSet getvalores(String sqlcad) {
        ResultSet rs = null;
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            conn = DriverManager.getConnection("jdbc:derby:.\\BD\\nombrebasededatos.db");
            sttm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            //String sqlcad = "Select nombre, m2xgal, pregal, precub, descripcion from primer";
            rs = sttm.executeQuery(sqlcad);
            return rs;
        } catch (Exception e) {
            System.out.println("Error= " + e.getMessage());
            return rs;
        }
    }
    }
    

    【讨论】:

    • 你能解释一下.\\BD\\nombrebasededatos.dbC\...somePath...\BD\\nombrebasededatos.db之间的区别吗?
    【解决方案4】:

    我从来没有做过 derby(虽然做过一次 mysql),一切都是从 this simple example 开始的。实际上我什至没有读过演讲——我只是滚动到不言自明的例子的中间。

    【讨论】:

      【解决方案5】:

      要在 Java 中以嵌入式模式使用 Derby,我们需要执行以下步骤:

      • 使用org.apache.derby.jdbc.EmbeddedDriver 驱动程序,位于 derbyclient Maven 依赖项
      • 使用嵌入模式的连接字符串:jdbc:derby:dbname
      • 设置 Derby 系统主页: System.setProperty("derby.system.home", "/home/janbodnar/.derby");
      • 最后以编程方式关闭 Derby: DriverManager.getConnection("jdbc:derby:;shutdown=true");
      • 处理 XJ015 错误,在成功关机时触发

      可以在我的Java JDBC Derby programming tutorial 找到完整的工作示例。

      【讨论】: