java - 如何设置 Spring Boot 以在 @JdbcTest 类之后关闭连接池?

标签 java spring spring-boot integration-testing spring-jdbc

我们有一个使用 Postgresql 数据库的大型系统,数据库结构相当复杂。我们对该系统进行了许多与数据库相关的集成测试。 由于复杂的数据库结构和代码中 postres 特定 sql 的使用,使用 H2(或内存中的其他数据库)模拟 postgres 似乎非常不可靠。

因此,我们正在使用以下结构的 junit 测试:

@RunWith(SpringRunner.class)
@JdbcTest
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
@Sql( ... schema creation, sample data, etc  )
@ContextConfiguration(classes = ... dao and service classes used in the test)

当你有 2-3 个测试类时,一切都很好。当你有 10 个以上的测试类时,问题就开始出现了。据我了解,SpringBoot 为每个不同的上下文配置创建单独的连接池。为了尽可能地保持测试隔离,我们通常在上下文配置中仅包含测试内部使用的组件。因此 SpringBoot 创建了数十个连接池,导致连接池或 jdbc 驱动程序出现“太多连接”类型的错误。您可以一个接一个地运行测试,但不能一次运行所有测试(因此,告别 CI)。

我们正在使用以下解决方法。以下片段被复制粘贴到每个测试类:

// <editor-fold name='connection leaking fix'
@Autowired
private DataSource dataSource;
private static HikariDataSource hikariDataSource;

@Before
public void saveDataSource() {
    this.hikariDataSource = (HikariDataSource)dataSource;
}

@AfterClass
public static void releaseDataSource() {
    if (hikariDataSource != null) {
        hikariDataSource.close();
    }
}
// </editor-fold>

它有效,但您必须记住,您不应该将该片段粘贴到测试使用相同上下文配置的类。

问题 - 有什么方法可以告诉 spring boot 在每次测试类执行后关闭连接池,或者有什么方法可以限制 spring boot 创建的连接池数量?

最佳答案

@M.Deinum 是对的,在不破解某些解决方法的情况下解决问题的唯一方法是使用有限数量的配置。所以你可以使用这样的东西来测试 DAO 层:

@RunWith(SpringRunner.class)
@JdbcTest(includeFilters = @ComponentScan.Filter(Repository.class))
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
@Sql(...)

或者类似这样的东西来测试 DAO 和服务层:

@RunWith(SpringRunner.class)
@JdbcTest(includeFilters = {
    @ComponentScan.Filter(Repository.class),
    @ComponentScan.Filter(Service.class)
})
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE)
@Sql(...)

关于java - 如何设置 Spring Boot 以在 @JdbcTest 类之后关闭连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49445380/

相关文章:

spring - 使用 SB 2.4 禁用 Consul 进行集成测试

java - Java 中方法一致性问题

java - 如何创建平衡的团体

spring - 是否可以在Springboot Spring 执行器运行状况端点中停用MongoHealthIndicator?

java - 使用 Spring Boot、Jackson 和 Hibernate 的多对多关系

java - Spring Data Redis - 存储日期时出现问题

java - 使用 ITextRenderer 生成 PDF 后不应用内部样式

java - 如何应用连接池?

java - 带有 spring data 的多个数据源 - 需要设置属性 continueOnError

java - 为什么 bean 中的环境看不到集成上下文中源的属性?