web-dev-qa-db-de.com

ReactiveCrudRepository zur Verwendung von Hibernate im Frühjahr

Ist es möglich, Hibernate und Mysql mit ReactiveCrudRepository anstelle von CrudRepository zu verwenden? Ich habe einige Beispiele mit Spring Data Jpa und Hibernate ausprobiert, konnte es aber nicht zum Laufen bringen. Ich konnte nur einige Beispiele für ReactiveCrudRepository für MongoDB und cassandra finden.

17

Ist es möglich, Hibernate und Mysql mit ReactiveCrudRepository anstelle von CrudRepository zu verwenden? 

TL; DR:

Nicht bei Hibernate und MySQL, sondern bei R2DBC und Postgres, Microsoft SQL Server oder H2 . Schauen Sie sich Spring Data R2DBC an.

Lange Version

Warum nicht JPA?

Mit Hibernate/JPA ist dies in absehbarer Zukunft nicht der Fall. JPA basiert auf der Idee, dass Sie einen Teil Ihres Datenmodells in den Speicher laden, das resultierende Objektmodell bearbeiten und JPA diese Änderungen umwandeln lassen. All dies in einer einzigen Transaktion.

Dies ist sozusagen das Gegenteil, wie man mit einem reaktiven Speicher umgeht, bei dem man versucht, atomare Änderungen vorzunehmen und das Laden, Bearbeiten und Lagern zu entkoppeln, und dies alles ohne zu blockieren.

Warum nicht JDBC?

Wir müssen uns also die Technologieebene unterhalb von JPA ansehen: JDBC . JDBC blockiert jedoch immer noch: Sie senden eine SQL-Anweisung an Ihre Datenbank, und JDBC blockiert, bis Sie das Ergebnis erhalten. Und wieder widerspricht dies der Idee des Reaktiven: Blockieren Sie niemals. Man könnte dies in einen Thread-Pool einwickeln, um dies einigermaßen zu mildern, aber das ist eher eine Problemumgehung als eine Lösung.

Warum R2DBC?

Es gibt einige geeignete Treiber für einige Datenbanken, die für reaktive Repositorys verwendet werden könnten. Sie sind jedoch proprietär und daher keine gute Basis für etwas, das letztendlich in allen (relevanten) relationalen Datenbanken funktionieren sollte.

Das Spring Data-Team hoffte einige Zeit, dass ADBA diese Lücke füllen würde ..__ Aber die Diskussionen auf der Mailing-Liste machten deutlich, dass ADBA nicht auf Reaktive, sondern nur auf asynchrone Ziele abzielte. Wieder nicht das, was wir für eine reaktive Repository-Abstraktion benötigten.

Anfang 2018 entschieden verschiedene Personen, die an der Kreuzung oder reaktiv und relational lebten, einen Standard für den reaktiven Datenbankzugriff.

R2DBC (R eactive R elational D atabase A ccess) Ist ein Vorschlag für eine solche standard . Die Hoffnung ist, entweder Oracle dazu zu bringen, ADBA zu einem reaktiven Ansatz zu bewegen, oder falls dies nicht der Fall ist, wird es selbst zum Standard.

Und mit drei bereits verfügbaren Implementierungen sehen die Chancen für die zweite Option vielversprechend aus.

R2DBC selbst ist hauptsächlich ein SPI, d. H. Eine API, die von den Datenbankanbietern implementiert werden soll .. Das SPI ist so konzipiert, dass die Implementierer nur minimale Anforderungen stellen. Dies macht R2DBC jedoch auch etwas umständlich. Die Idee ist, dass andere Bibliotheken verstärkt werden und Bibliotheken erstellen, die auf Benutzerfreundlichkeit, zusätzlich zu diesem SPI, ausgelegt sind, wie es bei JDBC der Fall war.

Spring Data R2DBC

Spring Data R2DBC ist eine solche Bibliothek und bietet das, wonach Sie gefragt haben: Unterstützung für ReactiveCrudRepository, obwohl es unabhängig von JPA/Hibernate ist und MySQL noch nicht unterstützt wird.

Stand der Projekte

Sowohl R2DBC als auch Spring Data R2DBC hatten noch keine Produktionsversion und es wird mindestens einige Monate dauern, um dorthin zu gelangen.

Spring Data R2DBC hat gerade den ersten Meilenstein veröffentlicht. Siehe der Veröffentlichungsartikel für seine aktuellen Fähigkeiten .

R2DBC ist auf seinem sechsten Meilenstein. Weitere Informationen finden Sie im Release-Artikel

Siehe auch diese Antwort: Warum stellt Spring keine reaktiven (nicht blockierenden) Clients für relationale Datenbanken zur Verfügung?

Ursprüngliche Antwort als Referenz für Archäologen:

Ab sofort (Januar 2017) ist es nicht möglich.

Die aktuell relevante Version für den reaktiven Teil von Spring Data ist Spring Data Kay M1 (Sie können prüfen, ob eine neuere Version verfügbar ist. Auf der Startseite des Projekts )

Und ein Blog-Beitrag des Spring Data-Teams über diese Veröffentlichung und speziell die reaktiven Teile darin beginnt mit (Hervorhebung meines):

Spring Data Kay M1 ist die erste Version, die den reaktiven Datenzugriff unterstützt. Die anfängliche Reihe unterstützter Stores - MongoDB, Apache Cassandra und Redis - alle bereits reaktive Treiber für Schiffe, was sie zu sehr natürlichen Kandidaten für einen solchen Prototyp machte. 

Der Grund ist, dass es keinen standardmäßigen, nicht blockierenden Weg gibt, um auf eine relationale Datenbank zuzugreifen. Daher werden nur diejenigen unterstützt, die diese Art von API unterstützen. 

Man könnte eine ReactiveCrudRepository mit JPA oder JDBC implementieren und die Arbeit an einen Thread-Pool delegieren. Dies würde eine asynchrone API von außen bereitstellen, würde jedoch immer noch die Ressourcen für die Threads verbrauchen und zwischen unabhängigen Datenzugriffen blockieren, so dass nur ein kleiner Teil der Vorteile des reaktiven Ansatzes realisiert werden würde.

26
Jens Schauder

Nach dem Zitat aus der vorherigen Antwort

Man könnte ein ReactiveCrudRepository mit JPA oder JDBC implementieren und die Arbeit an einen Thread-Pool delegieren. Dies würde eine asynchrone API von außen bereitstellen, würde jedoch immer noch die Ressourcen für die Threads verbrauchen und zwischen unabhängigen Datenzugriffen blockieren, sodass nur ein kleiner Teil der Vorteile des reaktiven Ansatzes realisiert werden würde.

James Ward behauptet, es könne nicht blockierend sein. Ich meine, ich habe ihn gefragt:

ja ok, aber tut ScalikeJDBC-Async nicht genau dasselbe? Abfrage-Aufruf einfach in einen anderen Thread-Pool stellen?

und er antwortete

Nein, weil ScalalikeJDBC-Async https://github.com/mauricio ... verwendet, was eigentlich ein nicht blockierender (NIO) JDBCish-Datenbanktreiber ist.

Quelle

Sie können also reaktiv sein, indem Sie Hibernate + Spring-Daten durch postgresql-async ersetzen (sollte mit mysql funktionieren).

1
hanskoff