4

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

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

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

ありがとう!

4

3 に答える 3

4

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

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

于 2008-10-12T11:03:16.367 に答える
0

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

そうでなければ、まっすぐな方法はわかりませんが、私はあなたに「ハック」の方法を与えます

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

于 2008-10-07T22:47:09.003 に答える
-1

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

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

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

于 2008-10-07T22:45:24.607 に答える