什么是 Apache Derby
Apache Derby 是一个完全用 Java 编写的开源关系型数据库管理系统,由 Apache 软件基金会维护。Derby 最初由 IBM 开发,代号为 Cloudscape,后来被捐赠给 Apache 基金会成为开源项目。在 Oracle 收购 Sun Microsystems 后,Derby 也被称为 Java DB,并作为 JDK 的一部分分发。
Derby 的最大特点是轻量级和可嵌入性,核心 JAR 文件(derby.jar)仅有 2MB 大小,整个数据库占用磁盘空间约 3.5 MB,非常适合作为嵌入式数据库在 Java 应用中使用。
项目状态说明
需要特别注意的是,2025 年 10 月,Apache Derby 开发者投票决定将该项目退役(retire)并转为只读状态。这意味着 Derby 的开发和 bug 修复已经结束,不会再发布新版本。如果你正在考虑在新项目中使用嵌入式数据库,建议选择其他活跃维护的替代方案,如 H2 Database、SQLite 或 HSQLDB。
主要特性
轻量级设计
- 核心库 derby.jar 仅 2MB
- 完整安装包约 3.5 MB
- 纯 Java 实现,无需额外的本地库
- 支持数据库大小最高可达 50GB
SQL 标准支持
Derby 支持多个 SQL 标准版本:
- SQL-92(完整支持)
- SQL-1999(部分支持)
- SQL-2003(部分支持)
具体功能包括:
- 临时表(Temporary Tables)
- 索引(Indexes)
- 触发器(Triggers)
- 视图(Views)
- 存储过程(Stored Procedures)
- 外键约束(Foreign Keys)
- 事务支持(Transactions)
- 数据加密与安全
并发和事务
Derby 提供完整的 ACID 事务支持,能够处理并发访问,并支持多种隔离级别:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
运行模式
Derby 数据库支持两种运行模式,可以根据应用场景灵活选择:
内嵌模式(Embedded Mode)
在内嵌模式下,Derby 数据库与应用程序运行在同一个 JVM 中,数据库引擎作为应用的一部分启动。
特点:
- 共享同一个 JVM,内存占用小
- 性能最优,无网络通信开销
- 只能被同一 JVM 中的应用访问
- 适合单用户桌面应用、测试环境
连接字符串示例:
jdbc:derby:数据库名;create=true
网络模式(Network Server Mode)
在网络模式下,Derby 作为独立的数据库服务器运行,占用独立的 JVM 进程,可以通过网络接受多个客户端连接。
特点:
- 独立 JVM 进程,作为服务器运行
- 支持多个应用程序同时访问
- 通过 JDBC 客户端驱动连接
- 适合多用户、小型 Web 应用
连接字符串示例:
jdbc:derby://localhost:1527/数据库名;create=true
安装与配置
环境要求
- Java Development Kit (JDK) 1.6 或更高版本
- 支持所有 Java 平台(Windows、Linux、macOS 等)
下载安装
-
从 Apache Derby 官方网站下载二进制发行版:
http://db.apache.org/derby/derby_downloads.html -
解压到目标目录,例如
/opt/derby或C:\derby -
配置环境变量:
# 设置 DERBY_HOME export DERBY_HOME=/opt/derby # 添加到 PATH export PATH=$PATH:$DERBY_HOME/bin # 配置 CLASSPATH export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derbyclient.jar export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derbytools.jar export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derbynet.jar -
验证安装:
java org.apache.derby.tools.sysinfo
使用 ij 工具
Derby 提供了 ij 命令行工具(类似于 Oracle 的 SQL*Plus)用于与数据库交互:
# 启动 ij
ij
# 连接到数据库
connect 'jdbc:derby:mydb;create=true';
# 创建表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
# 插入数据
INSERT INTO users VALUES (1, 'Zhang San', '[email protected]');
# 查询数据
SELECT * FROM users;
# 断开连接
disconnect;
# 退出
exit;使用场景
适合的场景
-
开发和测试环境
- 快速搭建本地数据库环境
- 单元测试和集成测试
- 原型设计和概念验证
-
嵌入式应用
- 桌面应用程序
- 小型工具软件
- 配置管理和数据持久化
-
小型 Web 应用
- 个人博客系统
- 内部管理系统
- 数据量在 50GB 以下的应用
-
微服务存储
- Nacos 使用 Derby 作为默认的嵌入式存储
- 服务注册和配置中心
- 轻量级数据持久化需求
不适合的场景
-
大规模生产环境
- 高并发访问(每秒数千次查询)
- 大数据量(超过 50GB)
- 需要高可用和集群部署
-
对性能要求极高的场景
- 实时分析系统
- 高频交易系统
- 大规模数据仓库
与其他嵌入式数据库对比
Derby vs H2 Database
| 特性 | Apache Derby | H2 Database |
|---|---|---|
| 开发语言 | Java | Java |
| 体积 | 2MB | 2.5MB |
| SQL 标准 | SQL-92/99/2003,标准遵循度高 | SQL-92,部分 SQL-99 |
| 性能 | 中等 | 较快,优化更好 |
| Web 控制台 | 无 | 内置 Web 控制台 |
| 内存模式 | 支持 | 支持,性能更优 |
| 项目状态 | 已退役(2025) | 活跃开发中 |
| 适用场景 | 稳定的长期部署 | 测试、内存使用、快速开发 |
Derby vs SQLite
| 特性 | Apache Derby | SQLite |
|---|---|---|
| 开发语言 | Java | C |
| 平台依赖 | 需要 JVM | 跨平台,无依赖 |
| 体积 | 2MB | < 1MB |
| 并发支持 | 较好 | 读并发好,写并发受限 |
| 事务支持 | 完整 ACID | 完整 ACID |
| Java 集成 | 原生支持 | 需要 JDBC 驱动 |
| 适用场景 | Java 应用嵌入 | 移动应用、简单存储 |
根据 DB-Engines 对比数据,H2 Database 在性能上通常优于 Derby,这得益于其优化的并发控制机制和内存存储选项。而 SQLite 则在简洁性、稳定性和极小体积方面无可匹敌。
优势与局限
优势
- 纯 Java 实现,完美集成 Java 生态
- 体积小巧,易于分发和部署
- 无需独立安装和配置(嵌入模式)
- SQL 标准遵循度高
- 完整的事务和并发支持
- 开源且 Apache License 2.0 许可
局限
- 性能不如现代嵌入式数据库(如 H2)
- 不适合大规模并发场景
- 数据库大小限制在 50GB
- 项目已退役,无后续更新和支持
- 缺少 Web 管理界面
- 社区活跃度下降
实际应用案例
Nacos 配置中心
Nacos 作为阿里巴巴开源的微服务注册和配置中心,在单机模式下默认使用 Derby 作为嵌入式数据库存储配置信息和服务注册数据。这是 Derby 在生产环境中的一个典型应用案例。
配置示例:
# Nacos 默认使用 Derby
spring.datasource.platform=derby当需要集群部署时,Nacos 建议切换到外部数据库如 MySQL。
开发测试环境
许多 Java 开发者使用 Derby 进行单元测试和集成测试:
// Spring Boot 测试配置
@TestPropertySource(properties = {
"spring.datasource.url=jdbc:derby:memory:testdb;create=true",
"spring.jpa.hibernate.ddl-auto=create-drop"
})替代方案建议
鉴于 Apache Derby 已经退役,对于新项目建议考虑以下替代方案:
H2 Database(推荐)
- 性能优于 Derby
- 活跃开发中
- 内置 Web 控制台
- 兼容 Derby 的大部分功能
- 官网:http://www.h2database.com
SQLite
- 极致轻量(< 1MB)
- 广泛应用于移动端
- C 语言实现,性能优秀
- 通过 JDBC 驱动可在 Java 中使用
HSQLDB
- 纯 Java 实现
- 支持内存和文件模式
- 较好的 SQL 标准支持
- 活跃的社区维护
总结
Apache Derby 作为一个经典的 Java 嵌入式数据库,在其活跃期间为 Java 开发者提供了轻量级、易用的数据持久化解决方案。它的纯 Java 实现、小巧体积和良好的 SQL 标准支持使其在开发、测试和小型应用场景中占有一席之地。
虽然 Derby 已经在 2025 年退役,但了解其设计理念和使用方式仍有价值,特别是对于维护遗留系统的开发者。对于新项目,建议选择 H2 Database、SQLite 等仍在活跃维护的替代方案,以获得更好的性能、功能和社区支持。