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

Spring Boot测试后Hikari Pool未关闭,TestContainer连接耗尽问题

问题解决思路

核心原因

带RestController的测试会触发Spring Boot创建完整的Web应用上下文,而纯Repository测试(如使用@DataJpaTest)仅启动JPA相关的轻量上下文。不同类型的上下文会被Spring视为独立环境,各自创建Hikari连接池;且测试结束后Web上下文的连接池未被及时销毁,导致连接数累积超出TestContainer的100连接上限。

解决方案

1. 统一所有测试的上下文配置

确保所有测试类使用相同的Spring Boot测试注解,避免创建多份独立上下文:

  • 所有测试类统一使用@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT),替代@DataJpaTest这类切片注解。这样Spring会复用同一个Web上下文,Hikari连接池也会共享,不会重复创建。
  • 如果需要保留切片测试的轻量特性,可在Repository测试类中添加@AutoConfigureWebMvc,强制其使用Web上下文配置,实现上下文复用。

2. 强制测试结束后清理连接池

在测试类中添加销毁逻辑,确保每个测试结束后关闭当前连接池:

@Autowired
private HikariDataSource dataSource;

@AfterAll
static void cleanUpConnectionPool(@Autowired HikariDataSource dataSource) {
    if (!dataSource.isClosed()) {
        dataSource.close();
    }
}

注意:如果使用上下文复用,此方法仅会在所有测试结束后执行一次,不会影响复用效率。

3. 调整Hikari连接池参数(临时缓解)

临时降低单个Hikari池的最大连接数,避免快速耗尽TestContainer的连接上限:
在application-test.yml中修改配置:

spring:
  datasource:
    hikari:
      maximum-pool-size: 20

此方法仅为临时方案,核心还是解决上下文复用问题。

4. 确保TestContainer与上下文绑定正确

检查@RestartScope注解是否生效,同时确保测试类未通过@DirtiesContext强制销毁上下文(除非必要)。@RestartScope会让TestContainer实例在上下文重启时复用,但如果上下文被频繁销毁重建,仍会导致连接池累积。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:15:00