什么是 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 DatabaseSQLiteHSQLDB

主要特性

轻量级设计

  • 核心库 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 等)

下载安装

  1. 从 Apache Derby 官方网站下载二进制发行版:

    http://db.apache.org/derby/derby_downloads.html
    
  2. 解压到目标目录,例如 /opt/derbyC:\derby

  3. 配置环境变量:

    # 设置 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
  4. 验证安装:

    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;

使用场景

适合的场景

  1. 开发和测试环境

    • 快速搭建本地数据库环境
    • 单元测试和集成测试
    • 原型设计和概念验证
  2. 嵌入式应用

    • 桌面应用程序
    • 小型工具软件
    • 配置管理和数据持久化
  3. 小型 Web 应用

    • 个人博客系统
    • 内部管理系统
    • 数据量在 50GB 以下的应用
  4. 微服务存储

    • Nacos 使用 Derby 作为默认的嵌入式存储
    • 服务注册和配置中心
    • 轻量级数据持久化需求

不适合的场景

  1. 大规模生产环境

    • 高并发访问(每秒数千次查询)
    • 大数据量(超过 50GB)
    • 需要高可用和集群部署
  2. 对性能要求极高的场景

    • 实时分析系统
    • 高频交易系统
    • 大规模数据仓库

与其他嵌入式数据库对比

Derby vs H2 Database

特性Apache DerbyH2 Database
开发语言JavaJava
体积2MB2.5MB
SQL 标准SQL-92/99/2003,标准遵循度高SQL-92,部分 SQL-99
性能中等较快,优化更好
Web 控制台内置 Web 控制台
内存模式支持支持,性能更优
项目状态已退役(2025)活跃开发中
适用场景稳定的长期部署测试、内存使用、快速开发

Derby vs SQLite

特性Apache DerbySQLite
开发语言JavaC
平台依赖需要 JVM跨平台,无依赖
体积2MB< 1MB
并发支持较好读并发好,写并发受限
事务支持完整 ACID完整 ACID
Java 集成原生支持需要 JDBC 驱动
适用场景Java 应用嵌入移动应用、简单存储

根据 DB-Engines 对比数据H2 Database 在性能上通常优于 Derby,这得益于其优化的并发控制机制和内存存储选项。而 SQLite 则在简洁性、稳定性和极小体积方面无可匹敌。

优势与局限

优势

  1. 纯 Java 实现,完美集成 Java 生态
  2. 体积小巧,易于分发和部署
  3. 无需独立安装和配置(嵌入模式)
  4. SQL 标准遵循度高
  5. 完整的事务和并发支持
  6. 开源且 Apache License 2.0 许可

局限

  1. 性能不如现代嵌入式数据库(如 H2)
  2. 不适合大规模并发场景
  3. 数据库大小限制在 50GB
  4. 项目已退役,无后续更新和支持
  5. 缺少 Web 管理界面
  6. 社区活跃度下降

实际应用案例

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(推荐)

SQLite

  • 极致轻量(< 1MB)
  • 广泛应用于移动端
  • C 语言实现,性能优秀
  • 通过 JDBC 驱动可在 Java 中使用

HSQLDB

  • 纯 Java 实现
  • 支持内存和文件模式
  • 较好的 SQL 标准支持
  • 活跃的社区维护

总结

Apache Derby 作为一个经典的 Java 嵌入式数据库,在其活跃期间为 Java 开发者提供了轻量级、易用的数据持久化解决方案。它的纯 Java 实现、小巧体积和良好的 SQL 标准支持使其在开发、测试和小型应用场景中占有一席之地。

虽然 Derby 已经在 2025 年退役,但了解其设计理念和使用方式仍有价值,特别是对于维护遗留系统的开发者。对于新项目,建议选择 H2 DatabaseSQLite 等仍在活跃维护的替代方案,以获得更好的性能、功能和社区支持。

参考资料