You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何为多个Spring Boot应用配置H2数据库持久化存储?

为多个Spring Boot应用配置H2数据库持久化存储

当然可以!H2完全支持持久化存储,而且能轻松让多个Spring Boot应用共享同一个H2数据库实例,下面我一步步给你拆解具体配置方法和关键注意事项~

1. 先搞定基础:从内存模式切换到持久化模式

默认的H2内存模式(jdbc:h2:mem:testdb)会在应用关闭后丢失数据,要改成持久化的文件模式,只需要修改每个Spring Boot应用的application.properties(或application.yml)配置:

本地文件存储(单应用使用)

如果只是单个应用需要持久化,用文件路径指定存储位置即可:

spring.datasource.url=jdbc:h2:file:/opt/data/h2/myappdb;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true # 可选,开启控制台方便调试数据
  • 解释:file:/opt/data/h2/myappdb是数据库文件的绝对路径,你也可以用相对路径比如file:./data/h2db,会在应用根目录下生成h2db.mv.db等核心文件。
  • DB_CLOSE_ON_EXIT=FALSE一定要加:默认H2会在应用关闭时释放文件锁,加上这个参数能让数据库文件保持可访问状态,方便后续其他应用连接。

服务器模式(多应用共享必备)

要是想让多个Spring Boot应用同时操作同一个数据库,必须把H2以TCP服务器模式启动,嵌入式模式会有文件锁冲突,没法多应用共享。

第一步:在其中一个应用里启动H2服务器

选一个主应用,添加一个配置类来启动H2的TCP服务器:

import org.h2.tools.Server;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.sql.SQLException;

@Configuration
public class H2ServerConfig {

    @Bean(initMethod = "start", destroyMethod = "stop")
    public Server h2TcpServer() throws SQLException {
        // 允许本地其他应用连接,端口设为9092(默认端口)
        return Server.createTcpServer("-tcp", "-tcpPort", "9092");
        // 如果需要允许其他机器连接,加上"-tcpAllowOthers"参数,生产环境谨慎使用
        // return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
    }
}

第二步:所有应用配置连接到H2服务器

每个Spring Boot应用的application.properties都要改成服务器模式的连接URL:

spring.datasource.url=jdbc:h2:tcp://localhost:9092//opt/data/h2/myappdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true

# 可选:让H2控制台也连接到服务器模式的数据库
spring.h2.console.settings.tcp-connect=true
spring.h2.console.settings.tcp-port=9092

2. 这些坑一定要避开

  • 文件锁冲突:如果不用服务器模式,多个应用同时访问同一个H2文件数据库会直接报错,所以多应用共享必须用TCP服务器模式。
  • 版本一致性:所有应用的H2依赖版本必须一致!版本不兼容会导致各种奇怪的连接或数据解析问题,比如在Maven里统一指定版本:
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.224</version> <!-- 用最新稳定版就行 -->
        <scope>runtime</scope>
    </dependency>
    
  • 数据备份:持久化的数据库文件要定期备份,最简单的方式是复制myappdb.mv.db文件(注意要在数据库无写入操作时复制),或者用H2的SQL命令备份:BACKUP TO '/opt/backups/myappdb_backup.zip';
  • 安全问题:如果开启了-tcpAllowOthers,一定要配合防火墙限制访问IP,生产环境建议给H2设置复杂的用户名和密码,避免未授权访问。

3. 验证配置是否成功

  1. 先启动带H2服务器的主应用,再启动其他应用。
  2. 打开任意应用的H2控制台(默认地址http://localhost:你的应用端口/h2-console),用服务器模式的URL连接,随便插入一条数据,然后切换到另一个应用的控制台查看,数据能同步就说明配置没问题啦!

内容的提问来源于stack exchange,提问作者Rik

火山引擎 最新活动