简介

当应用程序使用嵌入式Derby JDBC驱动程序访问Derby数据库时,Derby引擎不会在单独的进程中运行,也没有单独的数据库进程可以启动和关闭。相反,Derby数据库引擎运行在与应用程序相同的Java虚拟机(JVM)中。因此,Derby就像应用程序使用的任何其他jar文件一样成为应用程序的一部分。图1描述了这个嵌入式体系结构
在这里插入图片描述本节介绍如何使用Derby嵌入式JDBC驱动程序编译和运行一个简单的Java应用程序。

环境配置

配置Derby运行环境,请查看“Derby安装与环境配置”。

案例

复制案例程序

Derby软件包括一个名为SimpleApp.java的示例应用程序应用程序. 在Derby10.2及更高版本中,它位于Derby_INSTALL/demo/programs/simple/目录中。(在Derby10.1中,它位于Derby_INSTALL/demo/simple/目录中)。
默认情况下,此应用程序以嵌入式模式运行,并执行以下操作:

  1. 启动Derby引擎
  2. 创建并连接到数据库
  3. 创建表
  4. 插入数据
  5. 更新数据
  6. 查询数据
  7. 删除表
  8. 断开连接
  9. 关闭Derby

快速查看代码

SimpleApp.java 花了大部分时间创建表,在该表中插入数据,查询返回的数据并且演示了许多JDBC调用。本节重点介绍使其成为嵌入式Derby应用程序的JDBC调用。“DerbyNetworkServer”部分展示了相同的JDBC调用如何将相同的代码转换为客户机/服务器应用程序。

加载嵌入式JDBC驱动程序

SimpleApp加载Derby嵌入式JDBC驱动程序,并使用以下代码启动Derby:

public String driver = "org.apache.derby.jdbc.EmbeddedDriver";
...
Class.forName(driver).newInstance();

获取嵌入式连接

SimpleApp使用以下代码创建并连接到derbyDB数据库:

public String protocol = "jdbc:derby:";
...
conn = DriverManager.getConnection(protocol + "derbyDB;create=true", props);

完整构建的嵌入式连接URL如下所示:

jdbc:derby:derbyDB;create=true

关闭Derby

彻底关闭执行检查点并释放资源。如果嵌入式应用程序没有关闭Derby,则不会执行检查点。不会发生任何糟糕的情况;这只意味着下一个连接将变慢,因为Derby将运行其恢复代码。
关闭特定数据库的代码如下所示:

DriverManager.getConnection("jdbc:derby:MyDbTest;shutdown=true");

关闭所有数据库和Derby引擎的代码如下所示:

DriverManager.getConnection("jdbc:derby:;shutdown=true");

SimpleApp.java代码中使用第二个调用关闭所有数据库和引擎。您可能还注意到它测试了一个SQL异常。彻底关闭总是抛出SQL异常XJ015,可以忽略它。

编译案例程序

编译示例应用程序,如下所示:

javac SimpleApp.java

您可以忽略任何可能弹出的编译警告。

运行示例应用程序

运行示例应用程序,如下所示:

java SimpleApp

您应该会看到如下输出:

SimpleApp starting in embedded mode.
Loaded the appropriate driver.
Connected to and created database derbyDB
Created table derbyDB
Inserted 1956 Webster
Inserted 1910 Union
Updated 1956 Webster to 180 Grand
Updated 180 Grand to 300 Lakeshore
Verified the rows
Dropped table derbyDB
Closed result set and statement
Committed transaction and closed connection
Database shut down normally
SimpleApp finished

如果您看到类似下面的错误,则表示CLASSPATH设置不正确

java SimpleApp
SimpleApp starting in embedded mode.
exception thrown:
java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver
		at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
		at java.security.AccessController.doPrivileged(Native Method)
		at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:141)
        at SimpleApp.go(SimpleApp.java:77)
        at SimpleApp.main(SimpleApp.java:61)
SimpleApp finished

有关CLASSPATH的问题,请查看“Derby安装与环境配置”。

嵌入式Derby支持一个JVM中的多个用户

Derby支持给定数据库的多个连接。管理并发用户的嵌入式应用程序的一个例子是嵌入Derby的Tomcat或Geronimo应用程序服务器。任何数量的用户都可以执行通过该Web服务器访问数据库的Web应用程序。
但是,只有一个JVM可以启动(“打开”)该数据库,因此在不同JVM中运行的多个应用程序无法访问同一个数据库。为了更好地理解这一点,请执行以下操作。
SimpleApp创建了一个名为derbyDB的数据库。在一个窗口中,使用ij连接到此数据库,如下所示:

java org.apache.derby.tools.ij
ij version 10.4
ij> connect 'jdbc:derby:derbyDB';
ij>

现在,在另一个窗口中尝试运行SimpleApp:

java SimpleApp
SimpleApp starting in embedded mode
Loaded the appropriate driver

----- SQLException -----
  SQL State:  XJ040
  Error Code: 40000
  Message:    Failed to start database 'derbyDB', see the next exception for details.

----- SQLException -----
  SQL State:  XSDB6
  Error Code: 45000
  Message:    Another instance of Derby may have already booted the database C:\Apache\db-derby-10.4.1.3-bin\tutorial\derbyDB.
SimpleApp finished

SimpleApp尝试建立连接失败,因为另一个应用程序ij已经连接到derbyDB数据库。

问题是ij和Simple App运行在不同的JVM中,并且一个给定的数据库只能从一个JVM访问。第一个连接的应用程序“wins”,在本例中是ij,并阻止其他应用程序连接。
实际上,您可以从不同的jvm建立到给定数据库的多个连接。这是下一节“Derby网络服务器配置”要讲的。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐