2011-02-01 13 views
3

WebアプリケーションのデータのコンテキストとしてThreadLocalを使用することをお勧めしますか?ThreadLocalをデータのコンテキストとして使用することをお勧めしますか?

+0

なぜフレームワークによって提供されるSessionContextを使用しないでください? –

+0

@Marcos、あなたはSessionContextがJavaによって提供されていると言っていますか?申し訳ありませんが、あなたが参照しているフレームワークを取得していません... – peakit

+0

私は彼がHttpSessionおよび/またはServletContext(アプリケーションスコープ)を参照していたと思います。 – jhouse

答えて

6

これはそのために作られたものです。ただし、コンテキストの終わりにThreadLocalを削除するよう注意してください。そうしないと、メモリリークが発生したり、少なくとも未使用のデータを長時間保持したりする可能性があります。

ThreadLocalsも非常に高速です。HashMap<Thread,Object>と考えることができます。これは常にThread.getCurrentThread()と照会されます。

+2

それは 'HashMap >'となりますが、AFAIKは単に 'Thread'オブジェクトの内部' Map 'です。 –

6

これはデータの範囲によって異なります。 ThreadLocalは、ユーザーのセッションに固有のものではなく、要求スレッド固有のものです(各要求ごとに異なる要求処理スレッドが使用されます)。したがって、要求処理が完了したときにデータを削除することが重要になります(同じスレッドが要求を処理するときに他のユーザーのセッションに流入しないようにするため)。

2

1つのスレッドでリクエスト/レスポンスのペアを完成させているのであれば、私の経験ではうまく動作します。しかし、「イベント駆動型」Webアプリケーションは、Ajaxと高性能コンテナの登場により流行しています。これらのイベント駆動型モデルは、リクエストスレッドをそれらのスレッドプールに返すことを可能にする。 I/Oイベント中にスレッドが占有されず、外部サービス呼び出しが戻るのを待機します。その結果、単一の論理要求が複数の異なるスレッドによって処理される可能性があります。イベント駆動アーキテクチャとサーバー側のNIOを組み合わせることで、スループットが大幅に向上します。

あなたのアプリケーションにこのアーキテクチャがない場合は、私にとっては妥当と思われます。

このモデルに慣れていない場合は、Tomcat 6の「彗星」とJetty 6のContinuationsをご覧ください。これは、公式サーブレット3.0のサポートが予定されている非同期入出力のベンダー固有の実装です。 Tomcat 7は完全に3.0に準拠していると主張しています。

+1

実際にはイベント駆動型である必要はありません。スレッドがアイドル状態(IO待機中)の場合、WebSphere 7+はスレッドを再利用し、2つの異なる要求に対して1つのスレッドを動作させることができます。 2つの要求の間で作業が「多重化」されていることを実際に見てきました。 threadlocalsを使用すると、これは本当に醜いバグになります。 – Renan

1

ThreadLocalは、マルチスレッドプログラムでは、スレッド化されていないプログラムの静的/グローバルとほとんど同じです。すなわち、ThreadLocalの使用は偽物です。

+0

いいえ、パラメータを使わなくても、コンテキスト情報を関数呼び出し階層の深いところまで渡すのは良い方法です。 – Daniel

+3

@Danielええ、ちょうどシングルスレッドプログラムの静的/グローバルと似ています。 –

+0

独自のセッション処理を実行している場合、 'ThreadLocal'は良い選択です。ほとんどのWebフレームワークはこれを行い、より柔軟性を提供します(NIOベースのワーカースレッドに切り替える、セッションがスレッド間で切り替わるような) –

1

一般的に私はいいえと言います。あなたのためにフレームワークを使用してください。

WebアプリケーションのWeb層では、セッションスコープ(またはその他のフレームワーク特有のコンテキスト)を使用して、データを格納し、要求スコープで状態を示します。

ビジネス層を導入する場合、それはもちろん特定のウェブコンテキストに依存すべきではありません。 springおよびJava EEは、セキュリティ、トランザクションおよび永続性のためのソリューションをコンテキストとして提供します。

これを手動でタッチすると、本当に注意する必要があります。それは、クリーンアップの問題、メモリリーク、および奇妙なバグにつながる可能性があります...

関連する問題