Hibernate-reactive: Verbesserung - Integration mit spring @Transactional-Anmerkung

Erstellt am 20. Mai 2021  ·  16Kommentare  ·  Quelle: hibernate/hibernate-reactive

Hallo,

Wir evaluieren derzeit Hibernate Reactive, um unsere aktuelle Software zu ersetzen, die aus postgres-db+spring boot+spring data+r2dbc besteht. Wir waren bei der Verwendung von r2dbc mit vielen Einschränkungen konfrontiert und wollten das große Wissen, das wir bereits über Hibernate haben, wiederverwenden.
Wir haben fast einen vollständigen Mikrodienst umgestaltet, unsere eigenen Federdaten (generisches Repository) neu geschrieben und es sieht wirklich gut aus.

Eines der Hauptprobleme, das Entwickler ansprechen, ist die Option, deklaratives Transaktionsmanagement (mit Annotation) anstelle von programmatischem zu verwenden.

Wir wissen, dass es nicht der Zweck von Hibernate Reactive ist, einen solchen Mechanismus zu implementieren, sondern die Frameworks (Spring, Quarkus ...), die sich in Hibernate integrieren, wie es für das Standard-Hibernate getan wurde. Selbst wenn wir es selbst tun möchten, ist die Transaktions-API in Hibernate Reactive nicht die gleiche wie die Standard-Hibernate-API, und es gibt keine API, um mit dem Transaktionsmanager zu interagieren.

Ich würde mich freuen, wenn wir Ihre Kommentare dazu bekommen (und noch mehr, wenn Sie können :smiley:), und wenn Sie immer noch denken, dass wir es tun können, um die allgemeinen Richtlinien vorzuschlagen, weil wir derzeit keine Ahnung haben, wie wir das machen sollen.
Danke

problem

Alle 16 Kommentare

Nun, ich nehme an, dass Spring eine Art Interceptor-Konzept hat, bei dem Sie Anmerkungen verwenden können, um einen Interceptor an einen Bean-Methodenaufruf zu binden. Wenn Sie withTransaction() innerhalb eines solchen Interceptors aufrufen und dann an die Bean-Methode delegieren, ist das alles, was deklaratives Transaktionsmanagement ist. Eigentlich sollten es nur ein paar Zeilen Code sein. (Zumindest wäre es in CDI, beim Frühling bin ich mir weniger sicher.)

Die einzige Feinheit besteht darin, dass Sie eine Möglichkeit benötigen, um zu erkennen, ob bereits eine Transaktion an den aktuellen reaktiven Stream gebunden ist. In unserem Stapel würde dies mit MP-Kontexten erfolgen. Keine Ahnung, wie das in Springland gemacht wird.

(OTOH, wenn Sie nach der Integration mit einem XA-Transaktionsmanager fragen, nun, das ist eine ganz andere Dose Würmer und im Moment mit dem reaktiven Treiber nicht wirklich praktikabel. Wir haben noch keine wirklich reaktive Transaktion Manager.)

Im Moment brauchen wir keine verteilten Transaktionen

Dann sollte ein Abfangjäger, der SessionFactory.withTransaction() aufruft, gut funktionieren.

Werde es auf diese Weise versuchen und aktualisieren. Danke

@gavinking Es sieht so aus, als ob Spring @Transactional mit Aspect implementiert. Es ist nicht wirklich so wichtig, aber es kann auch einfacher für uns zu implementieren sein.
Aber ich denke, wir können es nicht nur tun, wenn Sie eine API für openTransaction() commitTransaction() und rollbackTransaction() in der Stage-Klasse verfügbar machen, da wir eine openSession()- und eine closeSession()-API haben. Ich denke, das Transaktionsobjekt wird benötigt, und die withTransaction reicht nicht aus.
Macht das Sinn ?

Es sollte eine Art "Around"-Interceptor geben, mit dem Sie die Methode umbrechen und weiterleiten können.

(Es ist wahr, dass Sie dies nicht mit Vorher/Nachher-Abfangjägern tun können.)

@gavinking können Sie bitte erläutern, was Sie zuvor geschrieben haben: "In unserem Stapel würde dies mit MP-Kontexten erfolgen." um zu überprüfen, ob eine Transaktion bereits im aktuellen Stream gebunden ist? Können Sie sich auf Code oder Tests beziehen, die geschrieben wurden? Dasselbe gilt für die Sitzung. Wie kann ich verstehen, dass im aktuellen Stream bereits eine Sitzung geöffnet ist?
Danke.

Schau, ich habe keine Ahnung, wie du das im Frühling machst. Sie benötigen eine Art Konstrukt, das ähnlich wie ein Threadlocal ist, aber lokal an den aktuellen reaktiven Stream anstelle des Threads gebunden ist. Ich bin sicher, sie müssen etwas haben.

Ich werde derzeit spring @Transactional nicht verwenden, sondern unsere eigene transaktionale Annotation implementieren, um zu vermeiden, dass Spring zu sehr vertieft wird. Meine vorherige Frage bezog sich also auf Ihren Satz "In unserem Stack würde dies mit MP-Kontexten erfolgen".

"unser Stack" == Quarkus.

Ich sage, Sie müssen etwas Ähnliches in der Spring-Umgebung finden.

Denn wenn Sie keinen Wert an den aktuellen reaktiven Stream binden können, können Sie keine deklarativen Transaktionen haben, so einfach ist das, und Sie müssen Transaktionen nur "manuell" verwalten. (Was eigentlich supereinfach ist, indem man einfach withTransaction() anruft. Ich verstehe wirklich nicht, warum die Leute denken, dass sie dafür eine Anmerkung brauchen.)

Aber ich bin sicher, es muss einen Weg geben, es zu tun. Du fragst nur die falsche Person.

Es könnte dieses Ding sein, aber ich weiß es wirklich nicht https://projectreactor.io/docs/core/3.4.0-M1/api/index.html?reactor/util/context/Context.html

Schluss: ersetzt durch #782.

@yaakov-berkovitch mit dem Zeug, das ich mit #779 einbaue, sollte es für Sie noch einfacher sein, dies zu implementieren.

@gavinking Danke!!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen