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

Spring应用嵌入式H2数据库在外部SQL客户端显示为空的解决问询

这个问题我之前踩过坑,核心原因是H2内存数据库的默认行为和你没开启TCP服务导致的,我来给你捋清楚怎么解决:

问题根源

你当前的配置有两个关键问题:

  1. h2.tcp.enabled=false 直接关闭了H2的TCP服务,外部客户端根本没法通过网络连接到应用进程里的H2实例
  2. 用了mem:内存模式,默认情况下每个JDBC连接都会创建一个独立的数据库实例——你通过H2控制台访问的是应用进程内部的实例,但外部客户端连接时会新建一个完全空的内存实例,自然看不到数据
分步解决方案

1. 修改application.properties配置

把这些配置项调整好:

# 开启H2 TCP服务,允许外部客户端通过网络连接
h2.tcp.enabled=true

# 修改数据源URL,添加参数让内存数据库实例保持共享,避免每个连接新建实例
spring.datasource.url=jdbc:h2:mem:dbname;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

# 基础的H2控制台配置(确保你能正常访问控制台)
spring.h2.console.enabled=true
spring.h2.console.path=/console
# 可选:如果需要从其他机器访问控制台,打开这个配置
spring.h2.console.settings.web-allow-others=true

2. 配置外部SQL客户端

打开你的SQL客户端(比如DBeaver、DataGrip),填入以下连接信息:

  • JDBC URL: jdbc:h2:tcp://localhost:9092/mem:dbname
  • 驱动类: org.h2.Driver
  • 用户名: 你配置的数据库用户名(默认是sa)
  • 密码: 你配置的数据库密码(默认是空)

配置完成后连接,就能看到和H2控制台里一样的数据库内容了。

额外建议:持久化数据

如果希望应用重启后数据库数据不丢失,建议把内存模式改成文件模式,这样数据会存在本地文件里:

# 文件模式的数据源URL,数据会存在项目根目录下的data文件夹中
spring.datasource.url=jdbc:h2:file:./data/dbname;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

对应的外部客户端JDBC URL改为:jdbc:h2:tcp://localhost:9092/file:./data/dbname

这样不管应用怎么重启,数据都会保留,外部客户端也能正常访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:08:10