【发布时间】:2021-12-01 21:39:05
【问题描述】:
我们有 Spring Boot 集成测试,并且会定期编写新的测试。 我注意到数据库连接一直在堆积:我运行的测试越多,与我的 PostgreSQL 实例的连接峰值就越高。
当运行所有测试时,Spring Boot 请求了超过 300 个连接,并且它开始使构建失败(我们的 max_connection 设置为 300)。
经过一番研究,我了解到在运行测试后连接没有被释放,因为 Spring Boot 测试:如果没有显式销毁上下文,则连接没有关闭。
我觉得这很奇怪,但尝试使用@DirtiesContext 来证明一点,在我们所有的测试类中,它确实解决了这个问题,因为它避免了峰值(一次不超过 30 个连接,不打桩最多 300 个),但由于此注释会在每个测试类之前强制重新创建上下文,因此构建速度要慢得多,而且我发现每次都需要重新创建 Spring 上下文以确保正确关闭连接并不是很令人满意。
数据源是HikariDataSource,使用配置类进行配置。
我发现的另一个解决方法是更改 Hikari 的最大池大小。我将其设置为低于默认值 10 的值(我不确定为每个测试类保留 10 个连接是否有用)。当我运行所有测试但它们仍在堆积时,此更改有效地降低了连接总数(只是降低了!)
我想我遗漏了一些东西,如何确保在每个测试课后关闭连接?一定有比@DirtiesContext 更好的方法,我就是找不到。感谢您的帮助。
【问题讨论】:
标签: spring postgresql spring-boot hikaricp