質問

WebSphere 7.0で実行されているJava EE 5アプリケーションに取り組んでおり、データベース監査ログレコードの永続性をマルチスレッドするスレッドセーフでパフォーマンスのある方法を見つけようとしています。 Java EEアプリケーション内で安全かつ効率的にログインするマルチスレッド監査ログを実行するための既知の方法はありますか?

いくつかの背景情報が必要な場合:アプリはWebサービスであり、それが受信することを要求する各メッセージは、データベースに持続する必要がある100または200の監査ログメッセージが作成されます。もともと監査ロギングは、java.util.logging.handlerを拡張するカスタム監査ハンドラークラスで行われ、公開メソッドはデータベース接続を開き、Logrecordから準備されたステートメントを入力し、挿入物を実行します。このカスタムハンドラーはEJBのスレッド内で実行されていたため、監査ロギングは各リクエストメッセージの応答時間に数秒になる可能性があり、SLAを見逃していました。

したがって、監査ハンドラーは、別のスレッドを作成するラッパーハンドラーに置き換えられました(はい、新しいスレッド()で、JavaEEのルールに反して)。ラッパーハンドラーはベクトルを使用して監査レコードをキューにし、監査ハンドラーを使用して個別のスレッドでできるだけ速く持続します。

Java EEのスレッドのルールを破りますが、このラッパーは非常にうまく機能しています... MDBでの同時の呼び出しを許可するまで。 ラッパーは、複数のEJBの呼び出しが許可されている場合に台無しにする可能性があり、各ログレコードを複数回データベースに保存する可能性があります。これは、ラッパーまたはスレッドの作成ロジックにバグがあることを示しているようです。

私はその問題を特定して修正することに取り組むつもりでしたが、最初により良い方法があるかどうかを最初に尋ねました。

役に立ちましたか?

解決

JMSを使用して、それらの監査メッセージをキューに配置し、それらを選択してデータベースに保存する他のサービスを呼び出します。これは、もちろん、すべてのログが必ずしもリアルタイムでデータベースに保存されるわけではないことを意味しますが、このアプローチはWebSphereからいくつかの作業をオフロードし、コードに標準の壊れたマルチスレッドがありません。

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