IntelliJ连接内存H2数据库成功但无法查看表内容问题
内存模式H2 IntelliJ连接后看不到表问题修复
内存模式(mem模式)H2的默认运行机制是仅同一JVM进程内的连接可访问同一份数据,跨进程发起的连接哪怕JDBC路径写法完全一致,也会生成独立的空内存库,这就是h2-console可以正常访问数据、IntelliJ连接后看不到表的根本原因——你当前在IntelliJ里配置的连接属于独立进程,根本没有接入项目运行时持有表和数据的那个H2内存实例。
操作步骤
- 调整项目侧H2配置,开启跨进程TCP访问
把你项目里的H2数据源连接地址改成TCP协议格式,同时加上库保活参数,以SpringBoot项目的yml/properties配置为例:spring.datasource.url=jdbc:h2:tcp://localhost:9092/mem:你的库名;DB_CLOSE_DELAY=-1
两个必填配置说明:
tcp://localhost:9092:指定H2启动可跨进程访问的TCP服务,端口可以自行替换为未被占用的端口DB_CLOSE_DELAY=-1:禁止最后一个连接断开后自动清空内存库,避免数据意外丢失
- 调整项目侧H2配置,开启跨进程TCP访问
- 配置项目启动时自动拉起H2 TCP服务
H2自带TCP服务能力,不需要额外引入依赖,在SpringBoot启动类或者配置类里加如下Bean即可:
注意这里的端口要和前面连接串里的端口保持一致。@Bean(initMethod = "start", destroyMethod = "stop") public Server h2TcpServer() throws SQLException { return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092"); }- 配置项目启动时自动拉起H2 TCP服务
- 重新配置IntelliJ侧的H2连接
先删掉之前创建的无效H2连接,等项目完全启动、表结构初始化完成后,再新建H2连接,连接地址填写和项目配置完全一致的TCP地址,用户名、密码和你访问h2-console时使用的凭证保持一致。
- 重新配置IntelliJ侧的H2连接
常见踩坑排查
- 不要在项目启动前就用IntelliJ发起连接:此时H2的TCP服务还未启动,IntelliJ会自行创建一个空的内存库实例,后续项目启动时会出现端口占用、库锁冲突问题
- 连接成功后手动勾选对应schema:IntelliJ默认不会加载所有schema,如果你建表时用的是默认的
PUBLICschema,需要在数据库面板的连接配置 -> Schemas标签页下把对应schema勾选上,再点刷新按钮才能看到表 - 确保连接串完全匹配:库名、端口写错会直接连到新的空实例,自然看不到任何业务表
配置完成后点击IntelliJ数据库面板的刷新按钮,就能看到和h2-console中完全一致的表和数据,后续可以直接在IDE内执行SQL、编辑数据,操作会实时同步到项目运行的内存库中。
内容的提问来源于stack exchange,提问作者Julien Berthoud
相关产品推荐
相关产品推荐

