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配置,强制其优先初始化:
同时在配置文件中调整连接池的超时配置,给H2服务预留启动时间,避免启动阶段过早检测连接失败:@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"); } }spring.datasource.hikari.initialization-fail-timeout=10000 - 修复本地地址解析不匹配问题
部分操作系统默认将localhost解析为IPv6地址::1,但H2 TCP服务默认绑定IPv4回环地址,会出现协议不匹配导致连接超时。直接将连接串中的localhost替换为明确的IPv4地址即可:
如果需要全局启用IPv4栈,可在JVM启动参数中添加spring.datasource.url=jdbc:h2:tcp://127.0.0.1:9092/~/test-db-Djava.net.preferIPv4Stack=true。 - 校验端口占用状态
启动应用后通过系统命令检查9092端口的实际监听情况:- Windows环境执行:
netstat -ano | findstr 9092 - Mac/Linux环境执行:
lsof -i:9092
如果端口被其他进程占用,更换一个未被使用的端口,同步修改H2服务Bean的端口参数和连接串中的端口号即可。
- Windows环境执行:
- 检查访问拦截规则
确认本机防火墙、安全软件、Spring Security拦截规则没有拦截本地回环地址的9092端口访问,可临时关闭防火墙测试连通性。 - 校验依赖作用域
确认构建文件(pom.xml/build.gradle)中H2数据库的依赖没有被设置为test作用域,否则非测试环境启动时H2服务类无法加载,不会正常绑定端口。
验证逻辑:应用启动后,可通过H2内置控制台尝试连接对应地址,控制台能正常连通说明H2服务启动正常,应用侧连接也会恢复。
内容的提问来源于stack exchange,提问作者user19254373
相关产品推荐
相关产品推荐

