【发布时间】: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