5

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?

Antwort

6

Sie sollten keinen Unterschied zwischen after_statement und after_transaction sehen, zumindest bei BTM. Theoretisch ist after_statement "korrekter", da die Verbindung und die Transaktion in einem XA-Kontext völlig unabhängig sein sollen und eine Verbindung in der Lage sein soll, mehrere Transaktionen gleichzeitig zu bedienen. In der Praxis sind Verbindungen und Transaktionen fast nie unabhängig, da fast keine Ressource dies unterstützt.

Der BTM-Verbindungspool implementiert eine relativ komplexe FSM, die es ermöglicht, die Transaktionen auf ihrer Verbindung isoliert zu halten und gleichzeitig eine Verbindung möglichst wieder zu verwenden.

Im Rahmen einer einzelnen Transaktion sollte immer wieder eine Verbindung aus dem Pool abgerufen und dann nur eine einzige Verbindung aus dem Pool genommen werden: die gleiche sollte immer vom Pool reserviert und wiederverwendet werden. Der einzige Grund, warum ich mir das vorstellen kann, ist, dass zwei Verbindungen aus dem Pool verbraucht werden, wenn Sie eine Verbindung wieder herstellen, während die erste noch nicht geschlossen wurde. Jeder andere Grund kann wahrscheinlich als Fehler im Verbindungspool von BTM angesehen werden.

+1

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. –

+0

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. –

+1

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. –