介绍
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) |
| 内存模式 | 支持(数据仅存于内存) | 支持 | 支持 | 支持() |
| 文件格式 | 单文件或目录 | 目录(多文件) | 单文件或目录 | 单文件(.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 是更好的选择。
