Wie bestimmen Sie, ob eine JDBC-Verbindung von einem JTA aktiviert Datasource oder gerade JDBC abgerufen wurde?

StackOverflow https://stackoverflow.com/questions/180713

  •  05-07-2019
  •  | 
  •  

Frage

Ich bin mit einem Anbieter API eine JDBC-Verbindung zu der Datenbank der Anwendung zu erhalten. Die API funktioniert, wenn in dem Anwendungsserver ausgeführt wird oder wenn in einem Stand-alone-Modus ausgeführt wird. Ich möchte eine Reihe von SQL-Anweisungen in einer einzigen Transaktion laufen. Ich gehe es gut mit ihnen im Zusammenhang mit der JTA Transaktion auftreten, wenn es vorhanden ist. Wenn es jedoch nicht, dann tut Ich brauche die JDBC Transaktionsdemarkation Methoden zu verwenden. (Calling diese Methoden auf eine JDBC-Verbindung, die in einer JTA Transaktion beteiligt verursacht eine SQLException.)

Also muss ich in der Lage sein, um zu bestimmen, ob die Verbindung vom JTA aktiviert Datasource geliefert wurde, oder wenn es nur eine gerade JDBC-Verbindung.

Gibt es einen straight forward Weg, um diese Bestimmung zu machen?

Danke!

War es hilfreich?

Lösung

Auch wenn es gerade JDBC ist, können Sie eine JTA Transaktion aktiviert haben. die autoCommit Flagge Überprüfung wird in dieser Hinsicht nicht helfen. Sie können in einer Transaktion sein, verteilt oder anderweitig, mit autoCommit auf false gesetzt. autoCommit auf true gesetzt würden Sie sagen, du bist nicht in einer verteilten Transaktion, sondern ein Wert false bedeutet nur, werden Sie nicht autocommit ... es in jeder Art von Transaktion sein könnte.

Ich glaube, Sie gehen zu müssen, rufen UserTransaction.getStatus () und stellen Sie sicher, dass es nicht gleich Status.NoTransaction ist (). Dies würde Ihnen sagen, wenn Sie in einem JTA Transaktion sind.

Andere Tipps

Was thilo sagt macht Sinn.

Ansonsten Nicht sicher eine geraden Art und Weise, aber ich werde Ihnen eine „Hack“ Art und Weise

Wie bitte BAD SQL, die Sie wissen, wird eine DB Ausnahme geben. Das wird in einem Stack-Trace zur Folge hat. Von der Stack-Trace können Sie herausfinden, ob es sich um eine JTA abgeleitete Verbindung ist oder nicht?

Sie könnten versuchen, die Verbindung der autoCommit Flagge zu überprüfen, um zu sehen, ob es in einer Transaktion ist (unabhängig davon, woher sie kam). (Offenbar sieht die akzeptierte Antwort, dies nicht zu gut funktioniert ich diese Antwort nicht löschen, weil die folgenden noch steht.)

Aber ich denke, Sie sollten wirklich Ihre API ändern ausschließlich auf externe Transaktionen ab. Wenn Sie noch schlicht JDBC unterstützen wollen, wickeln Sie es in eine eigene API, die nur die Transaktion beginnt.

Update: Gerade wieder lesen Ihre Frage und sah, dass Sie nicht eine API zur Verfügung stellen, wollen aber einen Container verwaltete Verbindung verwenden. Aber noch können Sie Mandat nur (als Teil Ihrer Anwendungsanforderungen), die JTA wirksam sein? Wenn nicht, könnten Sie eine Konfigurationsoption bieten wieder manuell gesteuerten Transaktionen fallen. Für eine solche kritische Eigenschaft scheint es vernünftig, die richtige Konfiguration zu erfordern (im Gegensatz zu versuchen, was angemessen wäre zu erraten).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top