From 8c690555fc68a3652fd08a0e02296af9151ae686 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 29 Oct 2024 09:46:52 +0100 Subject: [PATCH] Move Benchmarks from `performance` module into `spring-data-jpa`. Closes #3655 --- pom.xml | 6 - spring-data-jpa-performance/pom.xml | 129 ------------------ .../main/resources/META-INF/persistence.xml | 11 -- .../src/main/resources/logback.xml | 18 --- spring-data-jpa/pom.xml | 10 ++ .../benchmark/RepositoryFinderBenchmarks.java | 42 ++++-- .../benchmark}/model/IPersonProjection.java | 2 +- .../data/jpa/benchmark}/model/Person.java | 6 +- .../data/jpa/benchmark}/model/Profile.java | 2 +- .../repository/PersonRepository.java | 13 +- .../repository/query/HqlParserBenchmarks.java | 7 +- .../JSqlParserQueryEnhancerBenchmarks.java | 8 +- .../resources/META-INF/persistence-jmh.xml | 28 ++++ 13 files changed, 84 insertions(+), 198 deletions(-) delete mode 100644 spring-data-jpa-performance/pom.xml delete mode 100644 spring-data-jpa-performance/src/main/resources/META-INF/persistence.xml delete mode 100644 spring-data-jpa-performance/src/main/resources/logback.xml rename spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/RepositoryFinderTests.java => spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/RepositoryFinderBenchmarks.java (77%) rename {spring-data-jpa-performance/src/main/java/org/springframework/data/jpa => spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark}/model/IPersonProjection.java (93%) rename {spring-data-jpa-performance/src/main/java/org/springframework/data/jpa => spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark}/model/Person.java (97%) rename {spring-data-jpa-performance/src/main/java/org/springframework/data/jpa => spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark}/model/Profile.java (95%) rename {spring-data-jpa-performance/src/main/java/org/springframework/data/jpa => spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark}/repository/PersonRepository.java (71%) rename spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/HqlParserTests.java => spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/HqlParserBenchmarks.java (94%) rename spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerTests.java => spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerBenchmarks.java (94%) create mode 100644 spring-data-jpa/src/test/resources/META-INF/persistence-jmh.xml diff --git a/pom.xml b/pom.xml index 2311b378e..eb9720654 100755 --- a/pom.xml +++ b/pom.xml @@ -58,12 +58,6 @@ - - benchmark - - spring-data-jpa-performance - - hibernate-62 diff --git a/spring-data-jpa-performance/pom.xml b/spring-data-jpa-performance/pom.xml deleted file mode 100644 index fa836f34c..000000000 --- a/spring-data-jpa-performance/pom.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - 4.0.0 - - spring-data-jpa-performance - - jar - - Spring Data JPA - Performance - Benchmark build for Spring Data JPA - - - org.springframework.data - spring-data-jpa-parent - 3.4.0-SNAPSHOT - ../pom.xml - - - - 1.37 - - - - - - ${project.groupId} - spring-data-jpa - ${project.version} - - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - provided - - - - jakarta.annotation - jakarta.annotation-api - ${jakarta-annotation-api} - - - - jakarta.persistence - jakarta.persistence-api - ${jakarta-persistence-api} - compile - - - - ${hibernate.groupId}.orm - hibernate-core - ${hibernate} - - - net.bytebuddy - byte-buddy - - - compile - - - - ${hibernate.groupId}.orm - hibernate-jpamodelgen - ${hibernate} - provided - - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jaxb} - provided - - - - com.github.mp911de.microbenchmark-runner - microbenchmark-runner-junit5 - 0.4.0.RELEASE - test - - - - com.h2database - h2 - ${h2} - test - - - - com.github.jsqlparser - jsqlparser - ${jsqlparser} - test - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - - org.springframework.data.jpa.performance.tests - - - - - - - - - - - jitpack.io - https://jitpack.io - - - - diff --git a/spring-data-jpa-performance/src/main/resources/META-INF/persistence.xml b/spring-data-jpa-performance/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 4727d4263..000000000 --- a/spring-data-jpa-performance/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - org.hibernate.jpa.HibernatePersistenceProvider - org.springframework.data.jpa.domain.AbstractPersistable - org.springframework.data.jpa.domain.AbstractAuditable - org.springframework.data.jpa.model.Person - org.springframework.data.jpa.model.Profile - true - - diff --git a/spring-data-jpa-performance/src/main/resources/logback.xml b/spring-data-jpa-performance/src/main/resources/logback.xml deleted file mode 100644 index d026572cc..000000000 --- a/spring-data-jpa-performance/src/main/resources/logback.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - %d %5p %40.40c:%4L - %m%n - - - - - - - - - - - - diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml index 0f9c5d717..5251447ac 100644 --- a/spring-data-jpa/pom.xml +++ b/spring-data-jpa/pom.xml @@ -351,6 +351,16 @@ hibernate-jpamodelgen ${hibernate} + + org.hibernate.orm + hibernate-core + ${hibernate} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh} + jakarta.persistence jakarta.persistence-api diff --git a/spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/RepositoryFinderTests.java b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/RepositoryFinderBenchmarks.java similarity index 77% rename from spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/RepositoryFinderTests.java rename to spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/RepositoryFinderBenchmarks.java index af914d019..05f66f120 100644 --- a/spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/RepositoryFinderTests.java +++ b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/RepositoryFinderBenchmarks.java @@ -13,23 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.jpa.repository; +package org.springframework.data.jpa.benchmark; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; -import jakarta.persistence.Persistence; import jakarta.persistence.Query; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import jmh.mbr.junit5.Microbenchmark; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.Properties; import java.util.Set; +import org.hibernate.jpa.HibernatePersistenceProvider; +import org.junit.platform.commons.annotation.Testable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; @@ -42,21 +41,24 @@ import org.openjdk.jmh.annotations.Timeout; import org.openjdk.jmh.annotations.Warmup; import org.springframework.data.domain.Sort; -import org.springframework.data.jpa.model.IPersonProjection; -import org.springframework.data.jpa.model.Person; -import org.springframework.data.jpa.model.Profile; +import org.springframework.data.jpa.benchmark.model.IPersonProjection; +import org.springframework.data.jpa.benchmark.model.Person; +import org.springframework.data.jpa.benchmark.model.Profile; +import org.springframework.data.jpa.benchmark.repository.PersonRepository; import org.springframework.data.jpa.repository.support.JpaRepositoryFactory; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.util.ObjectUtils; /** * @author Christoph Strobl */ -@Microbenchmark +@Testable @Fork(1) @Warmup(time = 2, iterations = 3) @Measurement(time = 2) @Timeout(time = 2) -public class RepositoryFinderTests { +public class RepositoryFinderBenchmarks { private static final String PERSON_FIRSTNAME = "first"; private static final String COLUMN_PERSON_FIRSTNAME = "firstname"; @@ -103,12 +105,23 @@ public class RepositoryFinderTests { private void createEntityManager() { - Map properties = new HashMap<>(); + LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); + factoryBean.setPersistenceUnitName("benchmark"); + factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + factoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); + factoryBean.setPersistenceXmlLocation("classpath*:META-INF/persistence-jmh.xml"); + factoryBean.setMappingResources("classpath*:META-INF/orm-jmh.xml"); + + Properties properties = new Properties(); properties.put("jakarta.persistence.jdbc.url", "jdbc:h2:mem:test"); properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); properties.put("hibernate.hbm2ddl.auto", "update"); - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("benchmark", properties); + properties.put("hibernate.xml_mapping_enabled", "false"); + factoryBean.setJpaProperties(properties); + factoryBean.afterPropertiesSet(); + + EntityManagerFactory entityManagerFactory = factoryBean.getObject(); entityManager = entityManagerFactory.createEntityManager(); } @@ -139,7 +152,7 @@ public class RepositoryFinderTests { public List baselineEntityManagerHQLQuery(BenchmarkParameters parameters) { Query query = parameters.entityManager - .createQuery("SELECT p FROM org.springframework.data.jpa.model.Person p WHERE p.firstname = ?1"); + .createQuery("SELECT p FROM org.springframework.data.jpa.benchmark.model.Person p WHERE p.firstname = ?1"); query.setParameter(1, PERSON_FIRSTNAME); return query.getResultList(); @@ -148,7 +161,8 @@ public class RepositoryFinderTests { @Benchmark public Long baselineEntityManagerCount(BenchmarkParameters parameters) { - Query query = parameters.entityManager.createQuery("SELECT COUNT(*) FROM org.springframework.data.jpa.model.Person p WHERE p.firstname = ?1"); + Query query = parameters.entityManager.createQuery( + "SELECT COUNT(*) FROM org.springframework.data.jpa.benchmark.model.Person p WHERE p.firstname = ?1"); query.setParameter(1, PERSON_FIRSTNAME); return (Long) query.getSingleResult(); diff --git a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/IPersonProjection.java b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/IPersonProjection.java similarity index 93% rename from spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/IPersonProjection.java rename to spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/IPersonProjection.java index 224a90287..6934c0ae6 100644 --- a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/IPersonProjection.java +++ b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/IPersonProjection.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.jpa.model; +package org.springframework.data.jpa.benchmark.model; /** * @author Christoph Strobl diff --git a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/Person.java b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/Person.java similarity index 97% rename from spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/Person.java rename to spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/Person.java index 140e36998..3996c0b61 100644 --- a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/Person.java +++ b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/Person.java @@ -13,9 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.jpa.model; - -import java.util.Set; +package org.springframework.data.jpa.benchmark.model; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -25,6 +23,8 @@ import jakarta.persistence.Id; import jakarta.persistence.ManyToMany; import jakarta.persistence.Table; +import java.util.Set; + /** * @author Christoph Strobl */ diff --git a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/Profile.java b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/Profile.java similarity index 95% rename from spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/Profile.java rename to spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/Profile.java index cab53c2bf..816554553 100644 --- a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/model/Profile.java +++ b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/model/Profile.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.jpa.model; +package org.springframework.data.jpa.benchmark.model; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/repository/PersonRepository.java b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/repository/PersonRepository.java similarity index 71% rename from spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/repository/PersonRepository.java rename to spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/repository/PersonRepository.java index 4c1352006..3ba5fc00c 100644 --- a/spring-data-jpa-performance/src/main/java/org/springframework/data/jpa/repository/PersonRepository.java +++ b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/benchmark/repository/PersonRepository.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.jpa.repository; +package org.springframework.data.jpa.benchmark.repository; import java.util.List; import org.springframework.data.domain.Sort; -import org.springframework.data.jpa.model.IPersonProjection; -import org.springframework.data.jpa.model.Person; +import org.springframework.data.jpa.benchmark.model.IPersonProjection; +import org.springframework.data.jpa.benchmark.model.Person; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.ListCrudRepository; /** @@ -31,10 +32,10 @@ public interface PersonRepository extends ListCrudRepository { List findAllAndProjectToInterfaceByFirstname(String firstname); - @Query("SELECT p FROM org.springframework.data.jpa.model.Person p WHERE p.firstname = ?1") + @Query("SELECT p FROM org.springframework.data.jpa.benchmark.model.Person p WHERE p.firstname = ?1") List findAllWithAnnotatedQueryByFirstname(String firstname); - @Query("SELECT p FROM org.springframework.data.jpa.model.Person p WHERE p.firstname = ?1") + @Query("SELECT p FROM org.springframework.data.jpa.benchmark.model.Person p WHERE p.firstname = ?1") List findAllWithAnnotatedQueryByFirstname(String firstname, Sort sort); @Query(value = "SELECT * FROM person WHERE firstname = ?1", nativeQuery = true) @@ -42,6 +43,6 @@ public interface PersonRepository extends ListCrudRepository { Long countByFirstname(String firstname); - @Query("SELECT COUNT(*) FROM org.springframework.data.jpa.model.Person p WHERE p.firstname = ?1") + @Query("SELECT COUNT(*) FROM org.springframework.data.jpa.benchmark.model.Person p WHERE p.firstname = ?1") Long countWithAnnotatedQueryByFirstname(String firstname); } diff --git a/spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/HqlParserTests.java b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/HqlParserBenchmarks.java similarity index 94% rename from spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/HqlParserTests.java rename to spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/HqlParserBenchmarks.java index 1b9e16769..482c4454f 100644 --- a/spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/HqlParserTests.java +++ b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/HqlParserBenchmarks.java @@ -15,8 +15,7 @@ */ package org.springframework.data.jpa.repository.query; -import jmh.mbr.junit5.Microbenchmark; - +import org.junit.platform.commons.annotation.Testable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; @@ -32,12 +31,12 @@ import org.springframework.data.domain.Sort; /** * @author Mark Paluch */ -@Microbenchmark +@Testable @Fork(1) @Warmup(time = 2, iterations = 3) @Measurement(time = 2) @Timeout(time = 2) -public class HqlParserTests { +public class HqlParserBenchmarks { @State(Scope.Benchmark) public static class BenchmarkParameters { diff --git a/spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerTests.java b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerBenchmarks.java similarity index 94% rename from spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerTests.java rename to spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerBenchmarks.java index 33a462cfe..724a41735 100644 --- a/spring-data-jpa-performance/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerTests.java +++ b/spring-data-jpa/src/jmh/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerBenchmarks.java @@ -15,10 +15,9 @@ */ package org.springframework.data.jpa.repository.query; -import jmh.mbr.junit5.Microbenchmark; - import java.io.IOException; +import org.junit.platform.commons.annotation.Testable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Level; @@ -34,12 +33,12 @@ import org.springframework.data.domain.Sort; /** * @author Mark Paluch */ -@Microbenchmark +@Testable @Fork(1) @Warmup(time = 2, iterations = 3) @Measurement(time = 2) @Timeout(time = 2) -public class JSqlParserQueryEnhancerTests { +public class JSqlParserQueryEnhancerBenchmarks { @State(Scope.Benchmark) public static class BenchmarkParameters { @@ -58,7 +57,6 @@ public class JSqlParserQueryEnhancerTests { union select SOME_COLUMN from SOME_OTHER_OTHER_TABLE"""; enhancer = new JSqlParserQueryEnhancer(DeclaredQuery.of(s, true)); - } } diff --git a/spring-data-jpa/src/test/resources/META-INF/persistence-jmh.xml b/spring-data-jpa/src/test/resources/META-INF/persistence-jmh.xml new file mode 100644 index 000000000..60c6b5c97 --- /dev/null +++ b/spring-data-jpa/src/test/resources/META-INF/persistence-jmh.xml @@ -0,0 +1,28 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + org.springframework.data.jpa.domain.AbstractPersistable + org.springframework.data.jpa.domain.AbstractAuditable + org.springframework.data.jpa.benchmark.model.Person + org.springframework.data.jpa.benchmark.model.Profile + true + +