You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

内存H2数据库能否兼容R2DBC与JDBC?配置后数据无法读取

内存H2可同时用于JDBC和R2DBC,但你的配置存在问题

内存H2完全支持同时通过JDBC和R2DBC访问,你遇到的数据库为空问题,是因为当前配置下Liquibase执行完毕后内存数据库被销毁,R2DBC连接的是全新的空实例。

问题根源

H2内存数据库默认规则:当最后一个JDBC连接关闭时,会自动释放内存、销毁数据库实例。Liquibase执行完建表操作后会关闭JDBC连接,此时内存中的数据库被销毁;后续R2DBC连接时会创建一个新的空数据库,所以访问时会提示数据为空。

解决步骤

给JDBC和R2DBC的H2 URL添加DB_CLOSE_DELAY=-1参数,强制H2保留内存数据库实例,同时确保两者指向同一个数据库:

spring:
  liquibase:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    user: sa
    password: ""
  r2dbc:
    url: r2dbc:h2:mem:///testdb?DB_CLOSE_DELAY=-1
    username: sa
    password: ""

关键参数说明

  • DB_CLOSE_DELAY=-1:禁止H2在最后一个连接关闭时销毁数据库,持续保留内存中的数据。
  • DB_CLOSE_ON_EXIT=FALSE:避免JVM退出时自动关闭数据库(测试环境可选,但建议添加以增强稳定性)。
  • 确保JDBC和R2DBC的URL中数据库名称一致(均为testdb),参数匹配,才能保证两者连接的是同一个内存数据库实例。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:42:07