ZetCode

Derby 简介

最后修改于 2020 年 7 月 6 日

在本章中,我们将介绍 Derby 的基本概念和定义。

Derby 是一个用 Java 编写的关系数据库管理系统。它实现了 SQL-92 核心子集以及一些 SQL-99 特性。它使用 IBM DB2 SQL 语法。 Derby 的占地面积很小,大约 2MB。它具有事务支持。 Derby 使用的数据库格式是可移植且与平台无关的。

部署选项

Derby 可以以两种模式运行:嵌入式或客户端-服务器。在嵌入式模式中,Derby 引擎在应用程序的 Java 虚拟机中运行。应用程序直接且排他地访问数据库。没有其他应用程序可以同时访问数据库。在连接到数据库之前,无需设置 Derby 服务器。当我们加载嵌入式驱动程序时,Derby 引擎就会启动。

客户端-服务器模式下,Derby 提供了跨网络的多用户连接。 Derby 引擎在服务器的 JVM 中运行。其他应用程序可以从不同的 JVM 连接到数据库。在连接到数据库之前,我们必须启动一个数据库服务器。这类似于其他 RDBMS,如 Oracle 或 MySQL。

Derby 系统

Derby 系统由 Derby 引擎实例及其环境组成。它包括系统目录、数据库和系统范围的配置。每个数据库都位于系统目录的子目录中,该子目录的名称与数据库的名称相同。此外,它还有一个错误日志文件和一个可选的 derby.properties 文件。 Derby 将信息和错误消息写入默认名为 derby.log 的日志文件。属性文件包含特定于 Derby 系统的配置数据和参数。 derby 系统不是持久的。我们必须在每次启动时提供系统的位置。

Derby 系统由 derby.system.home 属性指定。如果该属性中指定的目录不存在,Derby 将自动创建它。如果我们没有显式指定该属性,则使用当前目录。当前目录是 JVM user.dir 属性的值。建议始终显式指定 derby.system.home

-Dderby.system.home=/home/janbodnar/.derby

该属性可以在命令行、环境变量、当我们使用 IDE 时的对话框中或在 derby.properties 文件中设置。

Derby 属性

derby.properties 是 Derby 系统的配置文件。它是一个简单的文本文件,它使我们能够配置整个 Derby 系统、特定的数据库或综合体。综合体是 Derby 中的表或索引。我们可以配置多个选项,例如用户授权、启动哪些数据库、日志文件的名称、系统目录的位置。 derby.properties 不是自动创建的;如果我们想使用它,我们必须创建该文件。

启动和结束 Derby 数据库

在嵌入式模式下,当应用程序首次连接到数据库时,数据库就会启动。可以配置 Derby 系统在启动时使用 derby.system.bootAll 属性启动所有可用的数据库。数据库启动后,一条消息将写入 derby.log 文件。通过在连接 URL 中指定 shutdown=true 属性来关闭数据库。我们可以关闭一个数据库或整个 Derby 系统。

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

第一个 JDBC 调用会关闭 testdb 数据库。第二个调用结束整个 Derby 系统。请注意,当系统关闭时会引发 SQLExpection。此异常应以编程方式处理。我们还应该在关闭数据库或系统之前关闭所有现有资源。

在客户端-服务器模式下,Derby 服务器使用 startNetworkServer 脚本启动,并使用 stopNetworkServer 脚本结束。它们位于安装目录的 bin 子目录中。

JAR 文件

在安装目录的 lib 子目录中,我们可以找到几个库。每个 JAR 文件都具有特定功能。

$ ls lib
derbyclient.jar        derbyLocale_it.jar     derbyLocale_zh_TW.jar
derby.jar              derbyLocale_ja_JP.jar  derbynet.jar
derbyLocale_cs.jar     derbyLocale_ko_KR.jar  derbyoptionaltools.jar
derbyLocale_de_DE.jar  derbyLocale_pl.jar     derbyrun.jar
derbyLocale_es.jar     derbyLocale_pt_BR.jar  derbytools.jar
derbyLocale_fr.jar     derbyLocale_ru.jar     derby.war
derbyLocale_hu.jar     derbyLocale_zh_CN.jar

derby.jar 是用于嵌入式数据库的库。我们需要在嵌入式应用程序的类路径中包含此 JAR 文件。在客户端-服务器模式下,此库必须位于服务器上。 derbynet.jar 用于启动 Derby 网络服务器。 derbyclient.jar 由连接到 Derby 网络服务器的客户端使用。 derbytools.jar 与 Derby 工具一起使用。 derbyrun.jar 文件是一个特殊的 jar 文件,它简化了我们如何调用 Derby 工具和网络服务器。最后,还有一些区域设置库。它们用于提供翻译后的消息。例如,derbyLocale_cs.jar 提供了捷克语消息。

Derby 模式

在数据库理论中,模式是数据库的结构。它用一种正式语言(SQL)描述。它指的是数据的组织。数据库模式的正式定义是一组对数据库施加的称为完整性约束的公式。

在 Derby 中,数据库模式的含义更窄。它是一个用于逻辑分组对象的容器。它类似于 Java 包或 C++ 命名空间。一个 Derby 数据库可以有多个模式。只要我们将两个表放在两个不同的模式中,我们就可以创建具有相同名称的两个表。 Derby 默认模式为 APP。如果我们没有提供任何模式,则数据库对象将分配给此默认模式。

在 Derby 中,使用 CREATE SCHEMA 语句创建模式。如果我们连接到数据库,我们在连接 URL 中提供的用户名将成为连接的当前模式。所有数据库对象都将在该模式中创建。可以使用 SET SCHEMA 语句更改当前模式。还有另一个内置模式,名为 SYS,用于隔离系统表。

Derby 有一个名为 dblook 的工具,用于转储数据库及其模式。该工具的输出是数据库在 DDL(数据定义语言)中的正式描述。

连接 URL

加载驱动程序后,将创建与数据库的连接。连接是与数据库的会话。在工作结束时,与数据库的连接将关闭。要建立连接,我们调用 DriverManager 类的 getConnection 方法。

连接 URL 指定连接的特征。

jdbc:derby:[subsubprotocol:][databaseName][;attribute=value]*

上面是 Derby 数据库连接 URL 的语法。默认的子协议是 directory:,它经常被省略。当我们在指定 memory: 子协议时,我们只能在内存中处理数据库。 databaseName 是我们要创建和/或连接到的数据库的名称。

我们可以在连接 URL 中使用多个属性。我们可以使用属性来创建数据库,连接到带有用户名和密码的安全数据库。此外,我们使用连接属性来关闭数据库或 Derby 系统、加密数据或从备份中恢复数据库。

jdbc:derby:testdb
jdbc:derby://:1527/testdb

我们使用不同的连接字符串连接到嵌入式和客户端-服务器 Derby 系统。第一个连接字符串连接到嵌入式数据库,第二个连接字符串连接到客户端-服务器数据库。 Derby 的默认端口是 1527。

jdbc:derby:testdb;create=true
jdbc:derby:testdb;shutdown=true
jdbc:derby:memory:testdb

我们还有另外三个连接字符串。第一个连接字符串创建 testdb 数据库。第二个关闭 testdb 数据库。第三个连接到在内存中创建的 testdb。

SQL 文件

在以下两个 SQL 文件 cars.sqlauthors_books.sql 中,我们创建了三个表,我们将在本教程中使用这些表。

cars.sql
-- SQL for the CARS table

SET SCHEMA USER12;
CREATE TABLE CARS(ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
    (START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
INSERT INTO CARS(Name, Price) VALUES('Audi', 52642);
INSERT INTO CARS(Name, Price) VALUES('Mercedes', 57127);
INSERT INTO CARS(Name, Price) VALUES('Skoda', 9000);
INSERT INTO CARS(Name, Price) VALUES('Volvo', 29000);
INSERT INTO CARS(Name, Price) VALUES('Bentley', 350000);
INSERT INTO CARS(Name, Price) VALUES('Citroen', 21000);
INSERT INTO CARS(Name, Price) VALUES('Hummer', 41400);
INSERT INTO CARS(Name, Price) VALUES('Volkswagen', 21600);

cars.sql 文件创建了 CARS 表。

authors_books.sql
-- SQL for AUTHORS and BOOKS tables

SET SCHEMA USER12;

CREATE TABLE AUTHORS(ID BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
    (START WITH 1, INCREMENT BY 1), NAME VARCHAR(25));
CREATE TABLE BOOKS(ID BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY 
    (START WITH 1, INCREMENT BY 1), AUTHOR_ID BIGINT, TITLE VARCHAR(150), 
    FOREIGN KEY(AUTHOR_ID) REFERENCES AUTHORS(ID));

INSERT INTO AUTHORS(NAME) VALUES('Jack London');
INSERT INTO AUTHORS(NAME) VALUES('Honore de Balzac');
INSERT INTO AUTHORS(NAME) VALUES('Lion Feuchtwanger');
INSERT INTO AUTHORS(NAME) VALUES('Emile Zola');
INSERT INTO AUTHORS(NAME) VALUES('Truman Capote');

INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(1, 'Call of the Wild');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(1, 'Martin Eden');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(2, 'Old Goriot');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(2, 'Cousin Bette');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(3, 'Jew Suess');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(4, 'Nana');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(4, 'The Belly of Paris');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(5, 'In Cold blood');
INSERT INTO BOOKS(AUTHOR_ID, TITLE) VALUES(5, 'Breakfast at Tiffany');

authors_books.sql 文件创建了两个表:AUTHORSBOOKS

来源

以下材料用于创建本教程:Derby 开发者指南、Derby 服务器和管理指南、Derby 入门、Derby 工具和实用程序指南以及 Derby 参考手册。

在本章中,我们介绍了 Derby 数据库的基本概念。