我有一个最多有 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个。
到目前为止我发现的内容如下:
问题出在你的测试上。
@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
,这只是开销。