使用in-memory模式的H2数据库能否在应用运行时持久化存储数据?
问题解答
1. 应用运行期间in-memory模式的H2数据库能否正常存储数据?
完全可以。你已经通过两个现象验证了存储逻辑正常:一是Hibernate打印了正常的insert执行日志,说明写入请求已经正确提交到数据库层;二是你可以在H2-console中查询到写入的数据,证明数据确实被存储在了内存中。
你配置的DB_CLOSE_DELAY=-1参数已经生效,只要应用对应的JVM进程没有关闭,内存中的数据就会持续保留,只有应用重启后数据才会被清空,符合H2官方对内存模式的特性描述。
2. 为什么IDEA的DataSource无法读取in-memory模式下的H2数据?
这是H2内存模式的进程隔离特性导致的:
- H2的in-memory模式默认只允许同一个JVM进程内的连接访问数据库,你启动的Spring应用和H2内存库运行在同一个JVM进程中,所以应用自身、同进程内的H2-console都可以正常读写数据。
- IntelliJ IDEA本身是独立的Java进程,DataSource面板发起的数据库连接是从IDEA的JVM进程向外发起的,属于跨进程访问,默认的in-memory模式没有对外暴露访问入口,自然无法读取到Spring应用进程内的内存数据。
你之前测试TCP连接jdbc:h2:tcp://localhost/mem:db1失败也是同样的原因:默认启动的H2内存库不会开启TCP监听服务,外部进程没有访问入口。如果确实需要外部进程访问内存库,可以在Spring应用启动时手动注册H2 TCP服务器,绑定固定端口后就可以通过TCP地址访问,但常规开发场景下直接用自带的H2-console查看内存数据即可,不需要额外配置。
内容的提问来源于stack exchange,提问作者invzbl3
相关产品推荐
相关产品推荐

