1. 简介

在本文中,我们将探讨如何配置 Spring Boot 应用以使用嵌入式的 H2 数据库,并深入了解 H2 数据库存储数据的位置。

H2 数据库 是一款轻量级、开源的数据库,目前没有商业支持。它支持多种运行模式:

  • Server 模式:通过 TCP/IP 使用 JDBC 或 ODBC 进行远程连接
  • Embedded 模式:使用 JDBC 进行本地连接
  • Mixed 模式:同时支持本地和远程连接

虽然 H2 可以配置为 内存数据库,但它也支持持久化存储(即将数据写入磁盘)。本文重点讨论的是 H2 在嵌入式模式下启用持久化存储的场景,即数据会实际落盘

2. 配置嵌入式 H2 数据库

若要在 Spring Boot 中使用 H2 数据库,我们需要在 pom.xml 文件中添加以下两个 Maven 依赖:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

✅ 注意:这两个依赖缺一不可,前者是数据库驱动,后者是 Spring Data JPA 的启动器。

3. H2 嵌入式持久化模式

前面提到,H2 支持将数据存储在文件系统中。相比内存模式,文件存储的最大优势在于应用重启后数据不会丢失

我们可以通过在 application.properties 文件中配置 spring.datasource.url 属性来控制 H2 的存储方式:

  • 内存模式(in-memory)示例:
spring.datasource.url=jdbc:h2:mem:demodb
  • 文件持久化模式则需替换掉 mem 参数,使用文件路径相关参数。

H2 创建的文件类型

当启用持久化时,H2 会在磁盘上创建以下几种文件:

  • demodb.mv.db:✅ 核心文件,包含数据、事务日志和索引
  • demodb.lock.db:🔒 数据库锁文件,数据库使用时自动创建
  • demodb.trace.db:📜 跟踪日志文件
  • demodb.123.temp.db:🧯 用于处理大对象(BLOB)或临时结果集
  • demodb.newFile:📦 数据库压缩时使用,保存新版本数据
  • demodb.oldFile:🗑️ 数据库压缩时使用,保存旧版本数据

⚠️ 实际开发中,通常只需关注 .mv.db.lock.db 文件。

4. H2 数据库存储位置配置

H2 提供了非常灵活的存储路径配置方式,可以指定以下几种目录:

4.1. 指定磁盘目录

你可以明确指定一个磁盘路径来存储数据库文件:

spring.datasource.url=jdbc:h2:file:C:/data/demodb

📌 注意:URL 中最后一部分是数据库名。即使省略 file: 关键字,H2 也会自动识别路径并创建文件。

4.2. 当前用户目录

使用波浪号 ~ 表示当前用户的主目录:

spring.datasource.url=jdbc:h2:file:~/demodb

在 Windows 系统中,这通常对应路径为:C:/Users/<当前用户名>

若想存储在用户目录下的子目录中:

spring.datasource.url=jdbc:h2:file:~/subdirectory/demodb

✅ 如果子目录不存在,H2 会自动创建。

4.3. 当前工作目录

使用 . 表示当前项目的工作目录(即应用启动目录):

spring.datasource.url=jdbc:h2:file:./demodb

存储在子目录中:

spring.datasource.url=jdbc:h2:file:./subdirectory/demodb

⚠️ 同样,子目录不存在时会自动创建。

5. 总结

本文简要介绍了 H2 数据库的嵌入式持久化机制,并详细说明了其在不同路径下的数据存储方式。通过合理配置 spring.datasource.url,我们可以灵活控制数据库文件的存储位置。

完整代码示例可从 GitHub 获取。


原始标题:Where Does H2's Embedded Database Store The Data?