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
相关产品推荐
相关产品推荐

