JDBC接続がJTA対応のDataSourceまたはストレートJDBCから取得されたかどうかをどのように判断しますか?

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

  •  05-07-2019
  •  | 
  •  

質問

ベンダーAPIを使用して、アプリケーションのデータベースへのJDBC接続を取得しています。 APIは、アプリケーションサーバーで実行する場合、またはスタンドアロンモードで実行する場合に機能します。単一のトランザクションで一連のSQLステートメントを実行したい。 JTAトランザクションが存在する場合、JTAトランザクションのコンテキストでそれらが発生しても問題ありません。ただし、そうでない場合は、JDBCトランザクション境界設定メソッドを使用する必要があります。 (JTAトランザクションに参加しているJDBC接続でこれらのメソッドを呼び出すと、SQLExceptionが発生します。)

だから、接続がJTA対応のDataSourceから来たものなのか、それとも単なるJDBC接続なのかを判断できる必要があります。

この決定を行うための簡単な方法はありますか?

ありがとう!

役に立ちましたか?

解決

ストレートJDBCであっても、JTAトランザクションを有効にすることができます。この点では、autoCommitフラグをチェックしても役に立ちません。 autoCommitをfalseに設定して、分散型またはその他の方法でトランザクションに参加できます。 autoCommitをtrueに設定すると、分散トランザクションではないことがわかりますが、falseの値は、自動コミットしないことを意味します...あらゆる種類のトランザクションである可能性があります。

UserTransaction.getStatus()を呼び出して、Status.NoTransaction()と等しくないことを確認する必要があると思います。これにより、JTAトランザクションを行っているかどうかがわかります。

他のヒント

thiloの言うことは理にかなっています。

それ以外の場合、まっすぐな方法はわかりませんが、「ハック」を提供します。方法

DB例外が発生することがわかっているBAD SQLを作成します。 その結果、スタックトレースが発生します。スタックトレースから、それがJTA派生接続であるかどうかを確認できますか。

ConnectionのautoCommitフラグをチェックして、トランザクション内にあるかどうかを確認できます(元の場所に関係なく)。 (どうやら、受け入れられた答えを見てください、これはあまりうまくいきません。以下がまだあるので、私はこの答えを削除していません:)

しかし、外部トランザクションのみに依存するようにAPIを実際に変更する必要があると思います。それでもプレーンJDBCをサポートする場合は、トランザクションを開始するだけの別のAPIにラップします。

更新:質問を読み直して、APIを提供していないが、コンテナー管理接続を使用したいことがわかりました。それでも、(アプリケーションの要件の一部として)JTAを有効にすることを義務付けることはできますか?そうでない場合は、手動で管理されるトランザクションにフォールバックする構成オプションを提供できます。このような重要な機能については、適切な構成を要求するのが妥当と思われます(何が適切かを推測しようとするのではなく)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top