Neues in Spring Data

In Spring Data Moore Release gibt es wieder jede Menge neues. Einiges davon stelle ich kurz in diesem Artikel vor. Einen großen Anteil hat die reaktive Programmierung inne.

Reaktives Transactional

Um Methoden Transaktionssicher zu machen, genügt es nun wie man es aus der imperativen Programmierung von Spring Data kennt die Annotation @Transactional an der Methode zu annotieren.

@Transactional
public Mono<Type> doSomething(Long id) {
    return repo.findById(id);
}

Elasticsearch reaktiv

Auch Elasticsearch hat eine reaktive API bekommen.

Die Vorteile der Reaktiven Programmierung sind das die Ergebnismenge nicht auf einmal in den Speicher geladen werden muss und sobald die ersten Daten bereitstehen werden sie im Flux zur Weiterverarbeitung bereitgestellt. Dieses ist besonders bei großen Datenmengen von Vorteil.

Es muss nur die Konfiguration vorgenommen werden. Der Typ ReactiveElasticsearchClient basiert auf dem WebClient.

class Config extends AbstractReaktiveElasticsearchConfiguration {
    @Bean
    @Override
    public ReactiveElasticsearchClient reactiveClient() {
        return ReactiveRestClients.create(localhost());
    }
} 

Nun kann das Template für die Abfrage genutzt werden. Als Ergebnis erhält man einen Flux.

@Autowired
ReactiveElasticsearchTemplate template;

// Query bauen
Criteria criteria = new Criteria("thema").contains("natur");
CriteriaQuery query = new CriteriaQuery(criteria);

// komplett reaktiv 
Flux<Dokument> result = template.find(query, Dokument.class);

Alternativ kann man Spring Data typisch eine reaktives Repository erstellen und Derived Queries darauf anwenden.

interface TestRepo extends ReactiveCrudRepository<...> {
     Flux<Dokument> findAllByKeywords(...);
}

@Autowired
TestRepo repo;

Flux<Dokument> result = repo.findAllByKeywords("natur");

Reactive QueryDSL

interface TestRepo extends ..., ReactiveQuerydslPredicateExecutor<...> {}

@Autowired
TestRepo repo;

//...
Predicate predicate = QCustomer.customer.lastname.eq("Pfau");
Flux<Customer> result = repo.findAll(predicate);

Performance in Spring Data

Eine Neuentwicklung sind die spring-data-dev-tools. Diese erlauben es JMH Benchmarks in JUnit Tests auszuführen. JMH dient als Messinstrument für die Performanceoptimierung in Spring Data.

Hier die Ergebnisse der Optimierungen zwischen RC1 und RC2:

Methode RC1 RC2 % Steigerung
findAll 52.213 61.244 17%
findByTitle 74.192 123.040 66%
repositoryByTitle 70.344 120.333 71%
repositoryByTitleDeclared 65.236 111.760 71%