小编TMT*_*MTH的帖子

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

我们有使用Postgresql DB的大型系统,具有相当复杂的数据库结构。而且,我们对该系统进行了许多与DB相关的集成测试。由于复杂的数据库结构以及代码中使用postres特定sql的原因,使用H2(或内存DB中的其他数据库)模拟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)
Run Code Online (Sandbox Code Playgroud)

当您有2-3个测试课程时,一切都OK。当您有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>
Run Code Online (Sandbox Code Playgroud)

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

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

java spring integration-testing spring-jdbc spring-boot

5
推荐指数
1
解决办法
1548
查看次数