轻量级、嵌入式数据库H2、Derby、HSQLDB、SQLite比较 作者:马育民 • 2025-10-25 08:57 • 阅读:10002 # 介绍 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 是更好的选择。 原文出处:http://malaoshi.top/show_1GW26W8SaEzt.html