Я пытаюсь распараллелить тесты в моем приложении весенней загрузки. Для этого я внес изменения в плагин maven surefire, включив параллельный аргумент с классами в качестве значения и аргумент подсчета потоков с 5 в качестве значения. Но когда я запускаю maven clean install, mvn clean install
я получаю PessimisticLockingFailure или Pessimisti c Exception.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<parallel>classes</parallel>
<threadCount>5</threadCount>
</configuration>
</plugin>
Для моих тестовых случаев я настроил базу данных H2 в файле свойств приложения, который находится в папке test. , После прочтения в Google я узнал, что мне нужно включить MVCC=TRUE;DEFAULT_LOCK_TIMEOUT=10000
в URL базы данных. Итак, поэтому файл свойств приложения имеет конфигурацию ниже:
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:h2:TestDB;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MVCC=TRUE;DEFAULT_LOCK_TIMEOUT=10000
jpa:
database-platform: io.github.jhipster.domain.util.FixedH2Dialect
database: H2
open-in-view: false
show-sql: true
hibernate:
ddl-auto: none
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
properties:
hibernate.id.new_generator_mappings: true
hibernate.connection.provider_disables_autocommit: true
hibernate.cache.use_second_level_cache: false
hibernate.cache.use_query_cache: false
hibernate.generate_statistics: false
hibernate.hbm2ddl.auto: validate
hibernate.jdbc.time_zone: UTC
Теперь я понимаю, что эта блокировка Pessimisti c выполняется, потому что она должна быть для того, чтобы следовать свойствам ACID. Также я понял, что в случае параллелизма H2 использует блокировку pessimisti c вместо блокировки optimisti c, что имеет смысл, поскольку мы не хотим использовать поврежденные данные. Но тогда как мне распараллелить мои тесты. Я также вижу, что при выполнении этих тестов maven использует разные потоки, так как имя потока печатается, но затем я получаю это Pessimisti c Exception.
Caused by: org.hibernate.PessimisticLockException: could not execute statement
at com.x.y.z.repository.a.ProductionDataRepositoryTest.setUp(ProductionDataRepositoryTest.java:45)
Caused by: org.h2.jdbc.JdbcSQLException:
Timeout trying to lock table ; SQL statement:
insert into my_table
Одна мысль, которая пришла мне в голову, заключается в том, что, возможно, , мы должны запускать отдельные экземпляры h2 для каждого потока, чтобы при наличии 4 потоков было 4 экземпляра h2, но тогда это не было бы дорого, а если нет, то как это сделать? Или есть какой-то другой подход в достижении распараллеливания тестов при весенней загрузке, java и maven.
Пожалуйста, предложите.