所以我有一个gradle的spring项目。我有很多集成测试,在一个内核上运行时,大约需要30分钟才能完成,因此我想使这些测试并行运行。为此,我决定使用gradle属性maxParallelForks,我将其设置为
tasks.withType(Test) {
maxParallelForks = Runtime.runtime.availableProcessors()
}
我有一个在数据库中设置某些实体的类(在docker容器中运行的postgres),它看起来像这样:
@Component
class DatabaseInitializer(private val peopleRepository:
PeopleRepository) : ApplicationRunner {
@Transactional
override fun run(args: ApplicationArguments?) {
peopleRepository.saveAndFlush(Person("john"))
}
}
问题:当我与gradle并行运行至少2个测试时,我得到一个DataIntegrityException,该异常表示具有此名称的Person已经在数据库中。发生问题是因为在gradle创建的每个fork中,DatabaseInitializer的run()方法几乎同时运行,而且我猜每个事务都试图将同一Person添加到数据库中。 此外,还有多种将实体添加到数据库的测试,一旦测试通过DatabaseInitializer,它们可能会开始失败。
所以我的问题是:有没有办法为我的数据库表实现某种类似于互斥的解决方案,可以处理这些并发事务,或者也许有另一种方法可以解决我的问题。
期待听到您对此问题的看法。预先感谢!