Gemäß Hibernate docs ist in einer JTA-Umgebung der Standardmodus Verbindungsfreigabe nach_Anweisung, was bedeutet, dass nach jeder Anweisung die logische Verbindung im Ruhezustand freigegeben wird.Ist es sicher, Hibernate after_transaction als einen JTA-Verbindungsfreigabemodus festzulegen, wenn Sie den Bitronix Transcation Manager verwenden?
Wenn die logische Verbindung freigegeben wird, wird die Connection-Methode close() aufgerufen und die aktuelle Ressource wird vom Transaktionsmanager entfernt.
Nach RedHat transaction developer guide:
„The delistResource Methode wird verwendet, um die angegebene Ressource aus dem Transaktionskontext in dem Zielobjekt dissoziieren Der Anwendungsserver ruft das Verfahren mit zwei Parametern:.
An XAResources object, which represents the resource.
A flag to indicate whether the operation is due to the transaction being suspended (TMSUSPEND), a portion of the work has failed (TMFAIL), or a normal resource release by the application (TMSUCCESS)."
Da Bitronix TMSUCCESS verwendet:
Es bedeutet, dass die Verbindung vom Strom getrennt ist Transaktionszweig und manchmal können Sie am Ende enlisting 2 different connections for the same Resource Adapter.
Ich denke, dass das Halten der Verbindung für so viel wie die Transaktion stattfindet, eine bessere Wahl ist, da wir normalerweise mehr als eine Anweisung pro Transaktion ausführen. Der After-Transaction-Release-Modus klingt also ansprechender.
Ist der after_transaction-Freigabemodus geeigneter mit Bitronix? Hat es jemand in einer Produktionsumgebung erlebt?
Danke für Ihre Antwort Ludovic. Die Sache ist, dass wir unser System in Produktion bringen werden und wir hatten nicht die Zeit, es mit dem Flag "after_transaction" zu testen. Aufgrund der Komplexität von Spring TM, Hibernate Transaction Logic Wrapper und Bitronix Inner Workings ist es sehr schwierig, den Schuldigen zu identifizieren. Obwohl ich die 2 Verbindung gesehen habe, wird der 2PC sie einfach als 2 isolierte XAR-Quellen behandeln, so dass die Atomarität des TX garantiert ist. Vielleicht werde ich nach dem Produktionsstart mehr Zeit haben, mich damit zu beschäftigen. –
Wenn ich diese Art von Problem verfolgen, sind BTM Debug-Protokolle von unschätzbarem Wert. Aktivieren Sie sie und stellen Sie sicher, dass Sie den zugeordneten Diagnosekontext konfigurieren, um die GTRID anzuzeigen (siehe http://docs.codehau.org/display/BTM/DebugLogging2x). Auf diese Weise können Sie Aufgaben, die im Auftrag jeder Transaktion ausgeführt werden, einfach trennen (z. B. indem Sie die Protokolle pro Transaktion mit einem einfachen grep teilen) und den logischen Fluss des Verbindungspools relativ einfach verfolgen. –
Danke, ich werde es definitiv versuchen.Es ist ziemlich frustrierend, dass wir das Problem niemals in einem Unit- oder Integrationstest isolieren konnten. Ich habe einen Systemintegrationstest, der gegen einen tatsächlichen produktionsähnlichen Server läuft, bei dem ich diese Anomalie in Protokollen sehen konnte. Wenn ich die Informationen sammle, werde ich einige Klassennamen verschleiern und sie in den BTM-Ausgabe-Post stellen, vielleicht können Sie eine Flussanomalie entdecken. –