spring TestContainers SQL连接过多异常错误

dzhpxtsq  于 2022-10-30  发布在  Spring
关注(0)|答案(2)|浏览(123)

我正在使用定义了3个SQL数据源的 Boot 。我正在使用SpringBoot属性为数据源创建3个TestContainer。
当我运行测试时,容器变得越来越慢,最终我得到了一个Caused by: java.sql.SQLNonTransientConnectionException: Too many connections异常。
测试示例如下:

  1. @Test
  2. @DisplayName("Require Client Access.")
  3. @Transactional(transactionManager = "thirdTransactionManager")
  4. @Sql(
  5. scripts = "/db/sql/some_test_data_basic.sql",
  6. config = @SqlConfig(dataSource = "thirdDatasource", transactionManager = "thirdTransactionManager"))
  7. void requireCustomerAccess() throws CompClientAccessException {
  8. //Assertions
  9. }

我正在使用FlyWay迁移模式,因此我不确定在每个测试类之间,Hikari或Flyway是否在每个方法类之后都没有关闭其连接池连接,从而导致连接过多?
我有3个通过Spring的道具启动的测试容器,如下所示。我可以在Docker中看到它们。

  1. datasource.jdbc.url=jdbc:tc:mysql:8.0.22:///databasename?TC_TEMPFS=/testtempfs:rw
  2. datasource.username=dev
  3. datasource.password=password

DatasourceConf的程式码片段(三个之一):

  1. @Qualifier("thirdDatasource")
  2. @Bean(name = "thirdDatasource")
  3. public HikariDataSource thirdDatasource() {
  4. HikariDataSource hikariDataSource = new HikariDataSource();
  5. hikariDataSource.setMaximumPoolSize(3);
  6. hikariDataSource.setJdbcUrl(thirdUrl);
  7. hikariDataSource.setUsername(thirdUsername);
  8. hikariDataSource.setPassword(thirdUsername);
  9. hikariDataSource.setDriverClassName(driverClassName);
  10. return hikariDataSource;
  11. }
  12. @Bean(name="thirdTransactionManager")
  13. @Qualifier("thirdTransactionManager")
  14. public PlatformTransactionManager thirdTransactionManager(
  15. final @Qualifier("thirdEntityManagerFactory") LocalContainerEntityManagerFactoryBean thirdEntityManagerFactory) {
  16. return new JpaTransactionManager(thirdEntityManagerFactory.getObject());
  17. }

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

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

谢谢你的帮助。

jchrr9hc

jchrr9hc1#

多亏了M.代努姆的帮助:
在测试之间缓存应用程序上下文,以帮助加快测试:https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#testcontext-ctx-management-caching
创建新的上下文,例如,使用不同的@MockBean集合,使用不同的Profiles
因此,在我的测试环境中缓存了16个以上的Hikari数据源,它们都至少使用了3-10个连接。这比TestContainer的默认值要多,所以当达到/缓存了一定数量的具有不同上下文的测试时,连接池(作为的总和)将无法创建到数据源的新连接,从而导致SQL连接错误。

要点:

更多地考虑测试重叠。即,如果已经完成了一些逻辑,它是否需要是一个完整的@SpringBootTest,或者MocMvcDataJPATest是否足够。
默认情况下,缓存的上下文数量为32,但可以通过JVM系统参数进行设置(请参阅文档)。

unftdfkk

unftdfkk2#

您还可以通过在测试资源目录中创建并添加一个包含以下内容的spring.properties文件来减小该高速缓存的最大大小:

  1. spring.test.context.cache.maxSize=4

在这种情况下,最大缓存大小将为4,而不是文档中提到的默认值32。
如果你遇到了这个问题,很可能意味该高速缓存一开始就不适合你,因为很多应用程序上下文都被认为是唯一的。

相关问题