内存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
相关产品推荐
相关产品推荐

