H2 数据库数据丢失问题解析
·
❌ 问题根源:配置错误导致的数据丢失
默认情况下,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("数据会在应用重启后保留!");
}
}
🔄 测试数据持久化
测试步骤:
-
第一次启动应用
bash
mvn spring-boot:run
访问 http://localhost:8080/h2-console,创建一些数据
-
停止应用
bash
Ctrl + C
-
检查文件是否存在
bash
ls -la ./data/ # 应该看到 lan-collab-platform.mv.db 文件
-
重新启动应用
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 -
✅ 手动删除了数据库文件
使用文件模式配置后,数据会持久化保存,和应用重启无关!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)