❌ 问题根源:配置错误导致的数据丢失

默认情况下,H2 不会删除数据! 数据丢失通常是因为错误的配置。

🔍 常见的导致数据丢失的配置

1. 内存数据库模式(最常见)

properties

# ❌ 数据在应用关闭时丢失
spring.datasource.url=jdbc:h2:mem:testdb

# ❌ 即使有名称,也是内存数据库
spring.datasource.url=jdbc:h2:mem:myapp

2. 自动清理配置

properties

# ❌ 应用关闭时删除数据库
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=TRUE

✅ 正确的持久化配置

方案1:文件数据库(推荐)

properties

# ✅ 数据持久化到文件
spring.datasource.url=jdbc:h2:file:./data/lan-collab

# ✅ 或者指定完整路径
spring.datasource.url=jdbc:h2:file:/home/user/appdata/lan-collab

# ✅ Windows 路径
spring.datasource.url=jdbc:h2:file:C:/app/data/lan-collab

方案2:服务器模式

properties

# ✅ 服务器模式,多应用可共享
spring.datasource.url=jdbc:h2:tcp://localhost/~/lan-collab

方案3:内存数据库持久化(开发用)

properties

# ✅ 内存数据库但不自动关闭
spring.datasource.url=jdbc:h2:mem:lan-collab;DB_CLOSE_DELAY=-1

📁 文件数据库的实际效果

使用文件模式后,H2 会创建物理文件:

text

项目目录/
├── data/
│   ├── lan-collab.mv.db     # 主数据文件
│   └── lan-collab.trace.db  # 日志文件
├── 应用代码
└── 配置文件

这些文件会一直存在,直到你手动删除!

🛠️ 完整的持久化配置示例

Spring Boot 配置

properties

# application.properties
# 文件数据库 - 数据持久化
spring.datasource.url=jdbc:h2:file:./data/lan-collab-platform
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# H2 控制台(开发时有用)
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

# JPA 配置
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

# 数据初始化(可选)
spring.sql.init.mode=always

验证数据持久化

java

@Component
public class DataPersistenceChecker {
    
    @EventListener
    public void checkOnStartup(ContextRefreshedEvent event) {
        System.out.println("=== H2 数据库状态 ===");
        System.out.println("数据库文件: ./data/lan-collab-platform.mv.db");
        System.out.println("数据会在应用重启后保留!");
    }
}

🔄 测试数据持久化

测试步骤:

  1. 第一次启动应用

bash

mvn spring-boot:run

访问 http://localhost:8080/h2-console,创建一些数据

  1. 停止应用

bash

Ctrl + C
  1. 检查文件是否存在

bash

ls -la ./data/
# 应该看到 lan-collab-platform.mv.db 文件
  1. 重新启动应用

bash

mvn spring-boot:run

数据应该还在!

⚠️ 特别注意

开发时的常见陷阱

properties

# ❌ 测试配置可能覆盖主配置
# 在 src/test/resources/application.properties 中
# 如果配置了内存数据库,测试时会使用内存模式

正确的多环境配置

properties

# application-dev.properties (开发环境)
spring.datasource.url=jdbc:h2:file:./data/lan-collab-dev

# application-test.properties (测试环境)  
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1

# application-prod.properties (生产环境)
spring.datasource.url=jdbc:h2:file:/opt/app/data/lan-collab

🎯 总结

H2 只有在以下情况会丢失数据:

  • ✅ 使用 jdbc:h2:mem: 内存模式

  • ✅ 配置了 DB_CLOSE_ON_EXIT=TRUE

  • ✅ 手动删除了数据库文件

使用文件模式配置后,数据会持久化保存,和应用重启无关!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐