首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TestContainers SQL太多连接异常

TestContainers SQL太多连接异常
EN

Stack Overflow用户
提问于 2021-07-21 11:41:55
回答 2查看 1.8K关注 0票数 0

我使用Spring定义了3个SQL数据源。我正在使用SpringBoot属性为数据资源创建3 TestContainers。

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

一个示例测试是:

代码语言:javascript
复制
    @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的道具开始,如下所示。我能在码头看到他们。

代码语言:javascript
复制
datasource.jdbc.url=jdbc:tc:mysql:8.0.22:///databasename?TC_TEMPFS=/testtempfs:rw
datasource.username=dev
datasource.password=password

DatasourceConf的一个片段(三个片段之一):

代码语言:javascript
复制
   @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正在为每个测试类重新构建,而不是关闭?

代码语言:javascript
复制
 o.h.e.j.s.SqlExceptionHelper   : HikariPool-45 - Connection is not available, request timed out after 30000ms.

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-21 20:49:53

感谢迪辛先生的帮助:

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

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

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

Takeaway:

更多地考虑测试重叠。也就是说,如果已经完成了一些逻辑,那么它是否需要是一个完整的@SpringBootTest,或者MocMvcDataJPATest就足够了。

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

票数 4
EN

Stack Overflow用户

发布于 2022-04-12 22:43:48

还可以通过在测试资源目录中添加具有以下内容的spring.properties文件来减小缓存的最大大小:

代码语言:javascript
复制
spring.test.context.cache.maxSize=4 

在这种情况下,最大缓存大小将为4,而不是文档中提到的默认32。

如果您有此问题,这很可能意味着缓存一开始就不适合您,因为很多应用程序上下文都被认为是唯一的。因此,缩小规模似乎是权宜之计。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68468851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档