使用测试容器执行 Spring Boot 测试后,Hikari 池未关闭

问题描述 投票:0回答:1

我有一个最多有 100 个连接的 Postgres 测试容器。测试容器可重复用于不同的测试。

   @Bean
   @ServiceConnection
   @RestartScope
   public PostgreSQLContainer<?> postgreSQLContainer() {
      return createpostgreSQLContainer( dockerImageName );
   }

Hikari Pool 最多有 25 个连接。

如果我现在连续运行超过 4 个 Spring Boot 测试类,我会看到为每个测试类创建了一个具有 25 个连接的 Hikari 池。但是,当测试结束时,这些池也将不再关闭。超过 4 次测试后,所有连接都用完,测试失败,因为无法再获取连接。

如何解决问题?

编辑: 我曾经构建了一个显示问题的MRE。如果您在 IDE(例如 Intellij)或 maven 中一起运行它们,您将在日志中看到错误消息。问题是打开了 2-3 个 Hikarki 池,有 55 个连接。但是TestContainer只能打开100个。

到目前为止我发现的内容如下:

  1. 如果您只在没有 RestController 的情况下进行存储库测试,那么将只创建一个 HikarkiPool 并为所有测试重用。
  2. 一旦添加了 RestController,Hikarki 池就不再被重用,并且会创建多个 Hikarki 池。然后问题就出现了。

spring-boot hikaricp testcontainers
1个回答
0
投票

问题出在你的测试上。

@ExtendWith( SpringExtension.class )
@SpringBootTest( 
  classes = { 
    TestConfig.class, 
    SQLContainerConfiguration.class,
    TestWebConfig.class }, 
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
@ActiveProfiles( "test" )
@EnableAutoConfiguration
class ConnectionPoolIssueTest1 {
@ExtendWith( SpringExtension.class )
@SpringBootTest( 
  classes = { 
    TestConfig.class, 
    SQLContainerConfiguration.class }, 
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
@ActiveProfiles( "test" )
@EnableAutoConfiguration
class ConnectionPoolIssueTest2 {
@ExtendWith( SpringExtension.class )
@SpringBootTest( 
  classes = { 
    TestConfig.class, 
    SQLContainerConfiguration.class,
    TestWebConfig.class }, 
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
@ActiveProfiles( "test" )
@EnableAutoConfiguration
class ConnectionPoolIssueTest3 {
@ExtendWith( SpringExtension.class )
@SpringBootTest( 
  classes = { 
    TestConfig.class, 
    SQLContainerConfiguration.class }, 
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
@ActiveProfiles( "test" )
@EnableAutoConfiguration
class ConnectionPoolIssueTest4 {
@ExtendWith( SpringExtension.class )
@SpringBootTest( 
  classes = { 
    TestConfig.class, 
    SQLContainerConfiguration.class,
    TestWebConfig.class }, 
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
@ActiveProfiles( "test" )
@EnableAutoConfiguration
class ConnectionPoolIssueTest5 {
@ExtendWith( SpringExtension.class )
@SpringBootTest( 
  classes = { 
    TestConfig.class, 
    SQLContainerConfiguration.class,
    TestWebConfig.class }, 
  webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
@ActiveProfiles( "test" )
@EnableAutoConfiguration
class ConnectionPoolIssueTest6 {

Spring框架参考指南中所述,Spring中的测试支持将使用内容缓存。为了确定一个键,有很多因素会影响它。使用 Spring Boot 它会变得更大,因为添加像

@MockBean
@SpyBean
这样的东西也会导致额外的上下文。

在您的测试设置中至少有 2 种不同的配置排列。由于

classes
一类有 2 个类和一类有 3 个类的差异。这将导致 2 个不同的实例。

提示: 您不需要

@ExtendWith
也不需要
@EnableAutoConfiguration
,这只是开销。

© www.soinside.com 2019 - 2024. All rights reserved.