Skip to content

SQL annotations

Jean Bisutti edited this page Feb 6, 2020 · 317 revisions

🚩 Table of contents

Quick start

Interesting checks

Available SQL annotations

Recommended global annotations

Cancel the behavior of global annotations

Recommended method annotations

Quick start

Add configuration

Check the configuration

To check that the configuration is properly done, you can try to add an annotation on a test method in order to make it fail. For example, add @ExpectSelect(0) on a test method that is supposed to send one or several selects to the database.

Use SQL annotations

You can use SQL annotations with a global scope, a class scope or a method scope.

Automatic framework detection

The SQL annotations automatically detect if Hibernate or Spring frameworks are used. You don't have any configuration to do. If a SQL property is not respected, the SQL annotations can suggest you solutions to fix it with these frameworks.

For example, the following message is diplayed when a N+1 select is presumed and Spring Data JPA is detected:

	* With Spring Data JPA, you may fix it by adding
	@EntityGraph(attributePaths = { "..." }) on repository method.
	https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.entity-graph

Interesting checks

You can take care of several things about SQL statements to promote performance and scalability at the beginning of application development.

⚠️ Do little configuration described in Quick start before using SQL annotations.

Available SQL annotations

SELECT statements

@ExpectSelect @ExpectMaxSelect
@ExpectSelectedColumn @ExpectMaxSelectedColumn
@DisableSameSelectTypesWithDifferentParams @EnableSameSelectTypesWithDifferentParams
@DisableExactlySameSelects @EnableExactlySameSelects

INSERT statements

@ExpectInsert

DELETE statements

@ExpectDelete

UPDATE statements

@ExpectUpdate @ExpectMaxUpdatedColumn

Debug annotations

@DisplaySql @DisplaySqlOfTestMethodBody

You can also use @DisplayAppliedAnnotations in debug activity.

Other

@ExpectJdbcBatching @ExpectMaxQueryExecutionTime
@DisableLikeWithLeadingWildcard @EnableLikeWithLeadingWildcard

Recommended global annotations

Configure recommended global annotations

A SqlAnnotationBuilder class is available to easily implement SpecifiableGlobalAnnotations.

package org.quickperf;
import org.quickperf.config.user.SpecifiableGlobalAnnotations;
import org.quickperf.sql.annotation.SqlAnnotationBuilder;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.Collection;
import static org.quickperf.sql.annotation.SqlAnnotationBuilder.*;

public class QuickPerfConfiguration implements SpecifiableGlobalAnnotations {
    public Collection<Annotation> specifyAnnotationsAppliedOnEachTest() {

        return Arrays.asList(
                // Can reveal some N+1 selects
                // https://blog.jooq.org/2017/12/18/the-cost-of-jdbc-server-roundtrips/
                disableSameSelectTypesWithDifferentParams()

                , // Sometimes, JDBC batching can be disabled:
                // https://abramsm.wordpress.com/2008/04/23/hibernate-batch-processing-why-you-may-not-be-using-it-even-if-you-think-you-are/
                // https://stackoverflow.com/questions/27697810/hibernate-disabled-insert-batching-when-using-an-identity-identifier
                expectJdbcBatching()

                , // https://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning
                disableLikeWithLeadingWildcard()

                , disableExactlySameSelects()

                // Not relevant with an in-memory database used for testing purpose
                , expectMaxQueryExecutionTime( 30, TimeUnit.MILLISECONDS)

        );

    }
}

The class implementing SpecifiableGlobalAnnotations has to be in org.quickperf package.

Cancel the behavior of global annotations at method level

Annotation Short description
@EnableExactlySameSelects Cancel behavior of @DisableExactlySameSelects
@EnableSameSelectTypesWithDifferentParams Cancel behavior of @DisableSameSelectTypesWithDifferentParams
@EnableLikeWithLeadingWildcard Cancel behavior of @DisableLikeWithLeadingWildcard
@ExpectJdbcBatching(batchSize=0) Cancel behavior of @ExpectJdbcBatching

Recommended method annotations

Annotations

πŸ‘‰ Β Core

πŸ‘‰ Β JVM

πŸ‘‰ Β SQL

πŸ‘‰ Β Scopes

πŸ‘‰ Β Create an annotation

Supported frameworks

πŸ‘‰ Β JUnit 4

πŸ‘‰ Β JUnit 5

πŸ‘‰ Β TestNG

πŸ‘‰ Β Spring

How to

πŸ‘‰ Β Detect and fix N+1 SELECT

Project examples

πŸ‘‰ Β Maven performance

πŸ‘‰ Β Spring Boot - JUnit 4

πŸ‘‰ Β Spring Boot - JUnit 5

πŸ‘‰ Β Micronaut Data - JUnit 5

πŸ‘‰ Β Micronaut - Spring - JUnit 5

πŸ‘‰ Β Quarkus - JUnit 5

Miscellaneous

πŸ‘‰ Β FAQ

πŸ‘‰ Β QuickPerf code

Clone this wiki locally