运行@SpringBootTest类时,连接不会关闭或堆积

kd3sttzy  于 2023-11-16  发布在  Spring
关注(0)|答案(2)|浏览(146)

我们有Sping Boot 集成测试,并定期编写新的测试。我注意到数据库连接已经堆积:我运行的测试越多,到我的PostgreSQL示例的连接峰值就越高。
当运行所有测试时,Sping Boot 请求的连接数超过了300个,并且开始构建失败(我们的max_connection设置为300)。
经过一些研究,我的理解是,由于Sping Boot 测试,在测试运行后连接不会被释放:如果上下文没有被显式销毁,连接不会被关闭。
我觉得这很奇怪,但是尝试使用@DirtiesContext来证明一点,在我们所有的测试类上,它确实解决了这个问题,因为它避免了峰值。(一次不超过30个连接,而不是像以前那样堆积到300个)但是由于这个注解强制在每个测试类之前重新创建上下文,构建变得慢了很多,我发现每次都需要重新创建一个Spring上下文来确保连接正确关闭并不令人满意。
数据源是HikariDataSource,使用配置类进行配置。
我发现的另一个解决方法是更改Hikari的最大池大小。我将其设置为低于默认值10的值(我不确定为每个测试类保留10个连接是否有用)。这个更改有效地降低了运行所有测试时的连接总数,但它们仍然堆积(只是更低!)

我想我错过了一些东西,我如何才能确保连接在每个测试类后关闭?必须有一个比@DirtiesContext更好的方法,我只是找不到它。谢谢你的帮助。

bihw5rsg

bihw5rsg1#

事实证明,几乎每个测试类都重新创建了context,因为我在测试中广泛使用了@MockBean annotation。由于它会影响Spring context,因此不同测试类中的每个@MockBean/No MockBean组合都算作不同的context,即:

  • 测试类1:bean MyService是一个MockBean,MyService不是
  • 测试类2:bean MyService是一个MockBean,MyService也是一个MockBean
  • 测试类3:这两个bean都不是MockBean

在这种情况下,将为每个类创建一个新的Spring上下文,因为bean配置不同,导致到Spring的连接数量增加。
为了(部分)解决这个问题,我在测试类的bean组合中寻找模式,并创建了一个名为TestMockBeans的新类。
它的唯一目的是声明尽可能多的MockBean和/或SpyBean,以便在类似的测试配置中重用。我用TestMockBeans扩展了相应的测试类,然后,因为它们共享这种类似的设置,Spring将它们的上下文标识为类似的,并且不会为每个测试类重新创建一个新的上下文。
正如您所猜到的,并不是我在Sping Boot 应用程序中的所有测试都需要Mockbeans(或者没有Mockbeans),所以它只是一个部分解决方案,但我希望它能帮助遇到相同问题的人缓解它。

g6baxovj

g6baxovj2#

你限制上下文刷新的变通方法也是很有价值的建议。但是我不得不限制连接,或者让它们在测试之间的Spring reinit期间关闭。
下面链接的建议对我有效,只是限制

spring.datasource.hikari.maximum-pool-size=2

字符串
Spring Boot "PSQLException: FATAL: sorry, too many clients already" when running tests

相关问题