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

Spring Boot连接H2数据库TCP服务模式报超时如何解决

H2 TCP服务模式连接超时修复方案

抛出java.net.SocketTimeoutException: connect timed out: localhost:9092的本质是客户端发起连接时,9092端口没有处于监听状态的H2 TCP服务,按以下步骤排查修复即可:

  • 调整Bean加载优先级,保证H2服务先于数据源启动
    现有配置没有指定H2 TCP服务Bean的加载顺序,Spring Boot默认会优先完成数据源自动配置,此时H2服务还未执行start方法绑定端口,连接必然失败。修改启动类的H2服务Bean配置,强制其优先初始化:
    @SpringBootApplication
    public class Application {
    
        // 省略其他业务代码
        
        @Bean(initMethod = "start", destroyMethod = "stop")
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public Server h2Server() throws SQLException {
            return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092");
        }
    }
    
    同时在配置文件中调整连接池的超时配置,给H2服务预留启动时间,避免启动阶段过早检测连接失败:
    spring.datasource.hikari.initialization-fail-timeout=10000
    
  • 修复本地地址解析不匹配问题
    部分操作系统默认将localhost解析为IPv6地址::1,但H2 TCP服务默认绑定IPv4回环地址,会出现协议不匹配导致连接超时。直接将连接串中的localhost替换为明确的IPv4地址即可:
    spring.datasource.url=jdbc:h2:tcp://127.0.0.1:9092/~/test-db
    
    如果需要全局启用IPv4栈,可在JVM启动参数中添加-Djava.net.preferIPv4Stack=true。
  • 校验端口占用状态
    启动应用后通过系统命令检查9092端口的实际监听情况:
    • Windows环境执行:netstat -ano | findstr 9092
    • Mac/Linux环境执行:lsof -i:9092
      如果端口被其他进程占用,更换一个未被使用的端口,同步修改H2服务Bean的端口参数和连接串中的端口号即可。
  • 检查访问拦截规则
    确认本机防火墙、安全软件、Spring Security拦截规则没有拦截本地回环地址的9092端口访问,可临时关闭防火墙测试连通性。
  • 校验依赖作用域
    确认构建文件(pom.xml/build.gradle)中H2数据库的依赖没有被设置为test作用域,否则非测试环境启动时H2服务类无法加载,不会正常绑定端口。

验证逻辑:应用启动后,可通过H2内置控制台尝试连接对应地址,控制台能正常连通说明H2服务启动正常,应用侧连接也会恢复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:45:39