在嵌入式系统选型中,SQLite 是绝大多数场景的标准选择,尤其是 C/C++、RTOS 或资源受限环境;H2 仅适用于基于 JVM 的服务端嵌入场景(如 Java 应用内嵌数据库)。
核心结论:嵌入式设备首选 SQLite,Java 服务端嵌入可考虑 H2。
- SQLite 优势:零配置、单文件、无 JVM 依赖、资源占用极低(KB 级)。
- H2 优势:Java 集成无缝、支持 MVCC 高并发、提供 Web 控制台。
- 关键风险:H2 无法运行在无 JVM 设备;SQLite 默认锁机制限制高并发写入。
架构与资源占用对比
选型前需明确运行环境是否支持 JVM。以下是典型资源占用对比:
| 特性 | SQLite | H2 Database |
|---|---|---|
| 运行依赖 | 无(C 库链接) | JVM(Java 虚拟机) |
| 内存占用 | 极低(~500KB) | 较高(依赖 JVM 堆) |
| 存储方式 | 单文件 | 文件或内存 |
| 适用场景 | IoT、移动端、本地存储 | Java 服务端、测试环境 |
关键配置与代码示例
根据选型结果,以下是核心配置命令与连接方式:
1. SQLite 配置(开启 WAL 模式优化并发)
默认情况下 SQLite 使用回滚日志,高并发写入易锁表。建议开启 WAL 模式:
PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;
在 C 语言中通过 sqlite3_exec 执行,或在连接后立即执行该 SQL。
2. H2 配置(持久化与内存模式)
H2 通过 JDBC URL 控制存储模式,需警惕内存模式数据丢失:
// 文件持久化(推荐生产环境)
jdbc:h2:file:./data/mydb
// 纯内存模式(重启数据丢失,仅测试用)
jdbc:h2:mem:testdb
Java 连接示例:
Connection conn = DriverManager.getConnection("jdbc:h2:file:./data/mydb", "sa", "");
并发性能验证方法
通过实际写入测试验证数据库是否满足并发需求:
- SQLite 锁等待测试:开启多个线程同时写入。若未开启 WAL,可能抛出 SQLITE_BUSY 或 database is locked 错误。
- H2 内存监控:运行高负载查询,观察 JVM 堆内存使用。若配置不当,可能抛出 OutOfMemoryError。
- 持久化验证:重启应用后查询数据。H2 内存模式数据将消失,SQLite 文件需确保权限正确。
常见风险与排查
- H2 嵌入式误区:切勿在单片机、RTOS 或无 JVM 的 Linux 嵌入式设备上尝试部署 H2,无法运行。
- SQLite 文件锁:多进程访问同一文件时,写操作会阻塞。排查方法:检查进程是否异常退出导致锁文件未释放。
- H2 数据丢失:使用 mem 模式未配置 DB_CLOSE_DELAY 时,连接关闭数据即清空。
原文链接:https://www.zjcp.cc/ask/10844.html
