我正在使用定义了3个SQL数据源的 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个通过Spring的道具启动的测试容器,如下所示。我可以在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.
谢谢你的帮助。
2条答案
按热度按时间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
,或者MocMvc
或DataJPATest
是否足够。默认情况下,缓存的上下文数量为32,但可以通过JVM系统参数进行设置(请参阅文档)。
unftdfkk2#
您还可以通过在测试资源目录中创建并添加一个包含以下内容的
spring.properties
文件来减小该高速缓存的最大大小:在这种情况下,最大缓存大小将为4,而不是文档中提到的默认值32。
如果你遇到了这个问题,很可能意味该高速缓存一开始就不适合你,因为很多应用程序上下文都被认为是唯一的。