すべてのデータベース操作の前にコンテキストを設定する必要があります(Oracleのパッケージレベルの変数を使用してみましたが、パッケージの再コンパイルに問題があるため、DBMS_SESSIONやDBMS_APPLICATION_INFOを試してみます)。これにより、特定のユーザー情報をどこでも取得できます。 「JBoss」として識別される数十のデータベース接続ではなく、それ(手順、トリガーなど)が必要です。
@StatelessBeanへの呼び出しをインターセプトするJavaEEインターセプターを作成しました。Oracle関数を呼び出して、セッションコンテキストを設定します(Java EE 6インターセプターでトランザクションがアクティブかどうかを確認する方法のサンプルコードについては、この質問を参照してください)。
私の最初の心配は接続プールでした。最初は、Java EEによって提供されるデフォルトの@PersistenceContext伝播で、すべてが同じ接続/トランザクション/ EntityManagerで実行されることを保証するのに十分だと思いました。finally
以前は、インターセプターの最後(ブロック内)ですべての設定を解除するだけで済みました。接続はプールに戻されます。少し壊れやすいように見えましたが、うまくいくと思いました。
次に、Hibernateにはhibernate.connection.release_mode ( hibernate.connection.release_modeに関するHibernateドキュメント、org.hibernate.ConnectionReleaseModeに関するRed Hatドキュメント)というプロパティがあり、 JTAトランザクションを使用する場合のデフォルトの推奨動作はリリースすることであることがわかりました。すべてのステートメントの後の接続(ドキュメントには、同じ基本接続の再取得について何かが書かれていますが、これは私を混乱させました)。
今では、ビジネスメソッドの途中で他の誰かが同じ接続を取得してユーザーコンテキストを混乱させるリスクなしに、このユーザー/操作にのみ表示されるインターセプターに何かを確実に設定できるかどうかさえわかりません。 。私が理解しているように、Oracleデータベースのセッション変数は、トランザクションや@PersistenceContextではなく、接続用に保持されます(データベースは永続コンテキストについて何も知らないため、接続は複数のトランザクションに使用できます)。
関係するすべてのテクノロジーの実装の詳細について学ぶにつれて、これはますます脆弱に見えるので、私はあきらめようとしています。このユーザーコンテキストのアイデアを機能させることはできますか、それともまったく異なるアプローチを試す必要がありますか?また、実装をテスト/デバッグして、並行性の問題が潜んでいないことを確認するにはどうすればよいですか?フレームワークの動作を監視するのに役立つイベントリスナーは見つかりませんでした。サーバーのストレステストを行うプログラムを作成するのは大変な作業であり、とにかく機能するかどうかわからないことに投資することはできません。
私はJBossAS7.1、EJB 3.1、Oracle 10gデータベース、およびJPA 2.0を使用しています(Hibernate固有のAPIは使用していませんが、Hibernateに支えられています)。