2011-01-03 8 views
5

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

背景情報が必要な場合:アプリケーションはWebサービスであり、受け取った各要求メッセージは100または200の監査ログメッセージを作成し、データベースに保存する必要があります。もともと監査ロギングはjava.util.logging.Handlerを拡張するカスタム監査ハンドラクラスで行われ、パブリッシュメソッドはデータベース接続を開き、準備されたステートメントをLogRecordから読み込み、挿入を実行します。このカスタムハンドラーはEJBのスレッド内で実行されていたため、監査ログは各要求メッセージの応答時間に数秒を追加し、SLAを見逃していました。

監査ハンドラは、Java EEのルールに対して、個別のスレッド(yes、新しいThread())を作成するラッパーハンドラに置き換えられました。ラッパー・ハンドラーは、ベクトルを使用して監査レコードをキューイングし、監査ハンドラーを使用して可能な限り速く別のスレッドに保持します。

Java EEスレッディングのルールが壊れていても、このラッパーはかなりうまく機能しています... MDBで同時呼び出しを許可するまで。ラッパーは、複数のEJB呼び出しが許可されている場合には失敗する可能性があり、潜在的に各ログレコードをデータベースに複数回保存します。これは、ラッパーまたはスレッド作成ロジックにバグがあることを示しています。

私はその問題の特定と修正に取り掛かっていましたが、もっと良い方法があればまず尋ねると思いました。

+0

MDBの同時呼び出しではどういう意味ですか? MDBの代わりにSpringのMessageListenerを使用する点を除いて、同様のモデルがあります。 –

+0

ActivationSpecificationには、1つのActSpecで同時に処理できるメッセージの数を指定する "最大サーバーセッション"プロパティがあります。これを1にする前に、1つのサーバーで1つのメッセージしか処理されませんでした。その数を1以上に増やすと、ある時点で複数のメッセージがサーバーによって処理されます。 –

+0

WebSphere MQを使用しているようです。 「最大サーバーセッション」は、MDBではなくWMQのキューブプロパティです。ですから、MQフォーラムに投稿することをお勧めします。 –

答えて

3

JMSを使用して、これらの監査メッセージをキューに入れてから、それらを取得してデータベースに格納する他のサービスを呼び出します。これはもちろん、すべてのログが必ずしもリアルタイムでデータベースに格納されるわけではありませんが、このアプローチではWebsphereからの作業負荷が軽減され、コードに標準的なマルチスレッドが作成されることはありません。

+0

ありがとう、それはいい考えです。私は、それがどのように負荷を処理するかを見るために概念の証明を試みると思います。 –

関連する問題