データベースでクエリにかかる時間をログに記録できるようにしたいと考えています。MyBatis を使用して DB にクエリを実行しています。
現在、select、update などのメソッドを持つステートレス Bean があり、Bean のクライアント (@EJB アノテーションを介して) がこれらのメソッドを呼び出します。これに加えて、ロギングを行うステートレス データベース インタラクション Bean にクラス レベルのインターセプターがあります。
ステートレス データベース インタラクション Bean を呼び出すと、セッションを開き、ユーザーのクエリを実行してからセッションを閉じます。すべて try finally ブロックで行います。これは、EJB クライアントがセッションを閉じたり、クエリにかかった時間をログに記録したりする必要がないため、便利です。
EJB クライアントが同じデータベースに対して 2 つのクエリを作成しようとすると、問題が発生します。ベンダーがサポートしていないため、XA データソースを使用できません。
これに対する回避策があります。ここでは、選択、更新などの各メソッドでセッションを開いたり閉じたりするのではなく、openSession() および closeSession() メソッドを使用する同様のステートレス db インタラクション Bean を実装しました。
私の懸念は、これがまだステートレス Bean であり、クライアントのトランザクションの途中で破棄されてロールバックが発生する可能性があることです。そうですか?ステートフル Bean にする必要がありますか?
また、ユーザーのために openSession() と closeSession() を実際に呼び出すインターセプターも作成したので、ユーザーは自分のクラスまたはメソッドに注釈を付けることができます。
これは良いパターンのように思えますか、それとも私が見逃しているこのケースを処理するための一般的なパターンはありますか? ありがとう。