轻量级、嵌入式数据库H2、Derby、HSQLDB、SQLite比较

介绍

H2、Apache Derby、HSQLDB(HyperSQL)和 SQLite 都是轻量级数据库,常用于嵌入式场景、开发测试或小型应用,但它们在实现语言、功能特性、性能和适用场景上有显著差异。以下是详细对比:

特性对比

特性 H2 Apache Derby HSQLDB SQLite
实现语言 纯 Java 纯 Java 纯 Java C 语言
开源协议 MPL 2.0 / EPL 1.0 Apache License 2.0 BSD 风格 Public Domain(无许可限制)
模式支持 嵌入式、服务器、内存 嵌入式、客户端/服务器 嵌入式、服务器、内存 嵌入式(单文件)
并发控制 支持多线程/连接(行级锁) 支持多线程/连接(行级锁) 支持多线程/连接 写操作独占(默认),可配置
SQL 兼容性 兼容 SQL 标准,支持 MySQL/Oracle 方言 兼容 SQL 标准,遵循 JDBC 规范 兼容 SQL:2016 大部分特性 支持 SQL 子集(无外键级联删除等)
JDBC 驱动 原生支持 原生支持 原生支持 需要第三方驱动(如 Xerial JDBC)
内存模式 支持(数据仅存于内存) 支持 支持 支持(:memory:)
文件格式 单文件或目录 目录(多文件) 单文件或目录 单文件(.db)
大小 约 2MB(jar 包) 约 3MB(核心 jar) 约 1.5MB(jar 包) 极小(库文件 ~600KB)

关键差异分析

(1)实现语言与跨平台性

  • H2/Derby/HSQLDB:纯 Java 实现,跨平台性极佳,只要有 JVM 即可运行,无需额外依赖,适合 Java 生态项目(如 Spring Boot 集成)。
  • SQLite:C 语言实现,需通过本地库(.dll/.so)运行,跨平台需编译对应版本,Java 中需通过 JDBC 驱动(如 sqlite-jdbc)间接调用,存在 JNI 开销。

(2)并发性能

  • H2/Derby:支持多线程并发读写,采用行级锁,适合多用户轻度并发场景。
  • HSQLDB:并发控制能力中等,适合中小型应用。
  • SQLite:默认写操作独占整个数据库(写锁阻塞所有读,读锁阻塞写),高并发写入性能较差,适合单用户或读多写少场景(可通过 WAL 模式优化)。

(3)功能丰富度

  • H2:功能最全面,支持全文索引、JSON 类型、分区表,兼容 MySQL/Oracle 语法,适合需要模拟其他数据库的场景。
  • Derby:企业级特性完善,支持存储过程、触发器、事务隔离级别(ACID 严格),稳定性强(曾是 JDK 内置的 Java DB)。
  • HSQLDB:SQL 标准兼容性最高,支持复杂查询、递归 SQL,适合对标准兼容性要求高的场景。
  • SQLite:功能精简,不支持外键级联删除、自定义函数(需 C 扩展)、网络访问(需额外工具),但足够满足简单存储需求。

(4)适用场景

  • H2:
    推荐用于 Java 项目的单元测试(内存模式启动快)、嵌入式应用(支持 Web 控制台管理)、需要兼容多种数据库方言的场景。
  • Apache Derby:
    适合企业级嵌入式应用(如桌面软件、中间件),强调稳定性和安全性,适合长期运行的服务。
  • HSQLDB:
    适合对 SQL 标准兼容性要求高的小型应用,或需要轻量级且功能较全的场景。
  • SQLite:
    适合非 Java 生态的嵌入式场景(如移动端、桌面应用)、单用户工具、数据量小(<1GB)且并发低的场景(如配置存储、日志记录)。

性能对比(参考)

  • 读操作:SQLite 最快(C 语言实现,无 JVM 开销),H2 次之,Derby 和 HSQLDB 略慢。
  • 写操作:H2 在并发写入时表现最优,SQLite 单线程写入快但并发差,Derby 稳定性优先但性能中等。
  • 内存模式:H2 和 HSQLDB 启动速度极快(毫秒级),适合测试场景。

建议

选择依据 推荐数据库
Java 项目、测试/嵌入式 H2(功能全、易用)
企业级稳定性、标准兼容 Apache Derby
严格遵循 SQL 标准 HSQLDB
跨语言、极小体积、单用户 SQLite

如果是 Java 开发者,优先考虑 H2(平衡了性能、功能和易用性);如果需要极致轻量化且不局限于 Java,SQLite 是更好的选择。


原文出处:/show_1GW26W8SaEzt.html