0

データベースでクエリにかかる時間をログに記録できるようにしたいと考えています。MyBatis を使用して DB にクエリを実行しています。

現在、select、update などのメソッドを持つステートレス Bean があり、Bean のクライアント (@EJB アノテーションを介して) がこれらのメソッドを呼び出します。これに加えて、ロギングを行うステートレス データベース インタラクション Bean にクラス レベルのインターセプターがあります。

ステートレス データベース インタラクション Bean を呼び出すと、セッションを開き、ユーザーのクエリを実行してからセッションを閉じます。すべて try finally ブロックで行います。これは、EJB クライアントがセッションを閉じたり、クエリにかかった時間をログに記録したりする必要がないため、便利です。

EJB クライアントが同じデータベースに対して 2 つのクエリを作成しようとすると、問題が発生します。ベンダーがサポートしていないため、XA データソースを使用できません。

これに対する回避策があります。ここでは、選択、更新などの各メソッドでセッションを開いたり閉じたりするのではなく、openSession() および closeSession() メソッドを使用する同様のステートレス db インタラクション Bean を実装しました。

私の懸念は、これがまだステートレス Bean であり、クライアントのトランザクションの途中で破棄されてロールバックが発生する可能性があることです。そうですか?ステートフル Bean にする必要がありますか?

また、ユーザーのために openSession() と closeSession() を実際に呼び出すインターセプターも作成したので、ユーザーは自分のクラスまたはメソッドに注釈を付けることができます。

これは良いパターンのように思えますか、それとも私が見逃しているこのケースを処理するための一般的なパターンはありますか? ありがとう。

4

1 に答える 1

0

1 つの DB のみを照会する場合、XA トランザクションは必要ありません。現在、トランザクションは複数の EJB メソッド呼び出しにまたがることができます。メソッドでトランザクション アノテーションが REQUIRED であり、メソッドが呼び出されたときにアクティブなトランザクションがある場合、メソッドは既存のトランザクションのスコープで実行されます。また、トランザクションには永続コンテキストが関連付けられているため、必要な場所にコンテナーに EntityManager を ( @PersistenceContext アノテーションを使用して) 注入させると、問題は解決します。この場合、EntityManager を手動で閉じる必要はありません。

于 2013-02-19T18:56:32.677 に答える