TestContainers SQL 连接过多异常

问题描述

我正在使用定义了 3 个 sql 数据源的 Spring Boot。 我正在使用 SpringBoot 属性为数据源制作 3 个 TestContainer。

当我运行我的测试时,容器变得越来越慢,最终我终于得到了一个 Caused by: java.sql.sqlNonTransientConnectionException: Too many connections 例外。

一个示例测试是:


    @Test
    @displayName("Require Client Access.")
    @Transactional(transactionManager = "thirdTransactionManager")
    @sql(
        scripts = "/db/sql/some_test_data_basic.sql",config = @sqlConfig(dataSource = "thirdDatasource",transactionManager = "thirdTransactionManager"))
    void requireCustomerAccess() throws CompClientAccessException {

         //Assertions
     }

我正在使用 FlyWay 来迁移架构,所以我不确定在每个测试类之间,Hikari 或 Flyway 是否没有在每个方法类之后关闭其连接池连接,从而导致连接过多?

我有 3 个 TestContainers 通过 Spring 的 props 启动,如下所示。我可以在 docker 中看到它们。

datasource.jdbc.url=jdbc:tc:MysqL:8.0.22:///databasename?TC_TEMPFS=/testtempfs:rw
datasource.username=dev
datasource.password=password

DatasourceConf 的片段(三个之一):

   @Qualifier("thirdDatasource")
    @Bean(name = "thirdDatasource")
    public HikariDataSource thirdDatasource() {
        HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setMaximumPoolSize(3);
        hikariDataSource.setJdbcUrl(thirdUrl);
        hikariDataSource.setUsername(thirdUsername);
        hikariDataSource.setPassword(thirdUsername);
        hikariDataSource.setDriverClassName(driverClassName);
        return hikariDataSource;
    }

    @Bean(name="thirdTransactionManager")
    @Qualifier("thirdTransactionManager")
    public PlatformTransactionManager thirdTransactionManager(

        final @Qualifier("thirdEntityManagerFactory") LocalContainerEntityManagerfactorybean thirdEntityManagerFactory) {
        return new JpaTransactionManager(thirdEntityManagerFactory.getobject());
    }


我猜HikariPools 正在为每个测试课程重新制作,而不是关闭

 o.h.e.j.s.sqlExceptionHelper   : HikariPool-45 - Connection is not available,request timed out after 30000ms.

感谢您的帮助。

解决方法

感谢 M. Deinum 的帮助:

应用程序上下文在测试之间缓存以帮助加速测试: https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testcontext-ctx-management-caching

创建一个新的上下文,例如使用不同的 @MockBean 集,使用不同的 Profiles

因此,在我的测试环境中缓存了超过 16 个 Hikari 数据源,它们都至少使用了 3-10 个连接。这不仅仅是 TestContainer 的默认值,因此当到达/缓存了具有不同上下文的特定数量的测试时,连接池(作为 的总和)将无法创建到数据源的新连接给出 SQL 连接错误。

外卖:

更多地考虑测试重叠。 IE。如果某些逻辑已经完成,它是否需要是完整的 @SpringBootTest 或者 MocMvcDataJPATest 是否足够。

缓存上下文的数量默认为 32,但可以通过 JVM 系统参数设置(参见文档)。