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% |