【问题标题】:How to setup Spring Boot to close connection pool after @JdbcTest class?如何在@JdbcTest 类之后设置 Spring Boot 以关闭连接池?
【发布时间】:2018-03-23 08:34:44
【问题描述】:

我们有使用 Postgresql DB 的大型系统,具有相当复杂的数据库结构。我们对该系统进行了许多与数据库相关的集成测试。 由于复杂的数据库结构和代码中 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)。

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

// <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>

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

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

【问题讨论】:

  • 不要加载/创建单独的配置。配置将被加载一次并重复使用。否则禁用上下文缓存(这可能是性能杀手)。
  • 实际上,问题在于为每个测试使用/加载单独的配置。

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


【解决方案1】:

@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(...)

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2017-06-09
    • 2014-11-16
    • 2021-11-30
    • 2014-10-23
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多