WebアプリケーションのデータのコンテキストとしてThreadLocalを使用することをお勧めしますか?ThreadLocalをデータのコンテキストとして使用することをお勧めしますか?
答えて
これはそのために作られたものです。ただし、コンテキストの終わりにThreadLocalを削除するよう注意してください。そうしないと、メモリリークが発生したり、少なくとも未使用のデータを長時間保持したりする可能性があります。
ThreadLocalsも非常に高速です。HashMap<Thread,Object>
と考えることができます。これは常にThread.getCurrentThread()
と照会されます。
それは 'HashMap
これはデータの範囲によって異なります。 ThreadLocalは、ユーザーのセッションに固有のものではなく、要求スレッド固有のものです(各要求ごとに異なる要求処理スレッドが使用されます)。したがって、要求処理が完了したときにデータを削除することが重要になります(同じスレッドが要求を処理するときに他のユーザーのセッションに流入しないようにするため)。
1つのスレッドでリクエスト/レスポンスのペアを完成させているのであれば、私の経験ではうまく動作します。しかし、「イベント駆動型」Webアプリケーションは、Ajaxと高性能コンテナの登場により流行しています。これらのイベント駆動型モデルは、リクエストスレッドをそれらのスレッドプールに返すことを可能にする。 I/Oイベント中にスレッドが占有されず、外部サービス呼び出しが戻るのを待機します。その結果、単一の論理要求が複数の異なるスレッドによって処理される可能性があります。イベント駆動アーキテクチャとサーバー側のNIOを組み合わせることで、スループットが大幅に向上します。
あなたのアプリケーションにこのアーキテクチャがない場合は、私にとっては妥当と思われます。
このモデルに慣れていない場合は、Tomcat 6の「彗星」とJetty 6のContinuationsをご覧ください。これは、公式サーブレット3.0のサポートが予定されている非同期入出力のベンダー固有の実装です。 Tomcat 7は完全に3.0に準拠していると主張しています。
実際にはイベント駆動型である必要はありません。スレッドがアイドル状態(IO待機中)の場合、WebSphere 7+はスレッドを再利用し、2つの異なる要求に対して1つのスレッドを動作させることができます。 2つの要求の間で作業が「多重化」されていることを実際に見てきました。 threadlocalsを使用すると、これは本当に醜いバグになります。 – Renan
ThreadLocal
は、マルチスレッドプログラムでは、スレッド化されていないプログラムの静的/グローバルとほとんど同じです。すなわち、ThreadLocal
の使用は偽物です。
いいえ、パラメータを使わなくても、コンテキスト情報を関数呼び出し階層の深いところまで渡すのは良い方法です。 – Daniel
@Danielええ、ちょうどシングルスレッドプログラムの静的/グローバルと似ています。 –
独自のセッション処理を実行している場合、 'ThreadLocal'は良い選択です。ほとんどのWebフレームワークはこれを行い、より柔軟性を提供します(NIOベースのワーカースレッドに切り替える、セッションがスレッド間で切り替わるような) –
一般的に私はいいえと言います。あなたのためにフレームワークを使用してください。
WebアプリケーションのWeb層では、セッションスコープ(またはその他のフレームワーク特有のコンテキスト)を使用して、データを格納し、要求スコープで状態を示します。
ビジネス層を導入する場合、それはもちろん特定のウェブコンテキストに依存すべきではありません。 spring
およびJava EE
は、セキュリティ、トランザクションおよび永続性のためのソリューションをコンテキストとして提供します。
これを手動でタッチすると、本当に注意する必要があります。それは、クリーンアップの問題、メモリリーク、および奇妙なバグにつながる可能性があります...
- 1. super()を使用することをお勧めしますか?
- 2. Luceneを使用することをお勧めしますか?
- 3. 要求属性の代わりにThreadLocalシングルトンを使用することをお勧めしますか?
- 4. vb.netモジュールを使用することをお勧めします
- 5. CSSフレームワークを使用することをお勧めしますか?
- 6. UAVロボットでシングルボードコンピュータを使用することをお勧めしますか?
- 7. URLにコロンを使用することをお勧めしますか?
- 8. WebフォームにContentEditableを使用することをお勧めしますか?
- 9. なぜCursorAdapterでautoRequeryを使用することをお勧めしますか?
- 10. LINQを頻繁に使用することをお勧めしますか?
- 11. WCFサービスでセルフトラッキングエンティティを使用することをお勧めしますか?
- 12. ウェブサイトで$ _SERVER ['DOCUMENT_ROOT']を使用することをお勧めしますか?
- 13. サロゲートキーで逆インデックスを使用することをお勧めしますか? (Oracle)
- 14. アニメーションで5-6スレッドを使用することをお勧めしますか?
- 15. DataContractSerializerインスタンスをキャッシュすることをお勧めしますか?
- 16. コンテンツロールアップのソリューションとしてSharePointのコンテンツ展開を使用することをお勧めしますか?
- 17. BootFacesとPrimeFAcesを併用することをお勧めしますか?
- 18. イベントソースとしてResultSetを持つObserverパターンを使用することをお勧めしますか?
- 19. ボタンをお勧めします..もしお勧めですか?
- 20. asp.netでSMTP.SendAsyncを使用することをお勧めします。
- 21. 単体テストでRowTestを使用することをお勧めします
- 22. スカラ用のIDEを開発することをお勧めしますか?
- 23. PhoneGapとSencha Touchを使用していることをお勧めしますか?
- 24. Crystal Reports:Crystal Reportsのlog4net.dllバージョンを使用してプロジェクトをコンパイルすることをお勧めしますか?
- 25. MVC3でAjaxデータを取得するには@ Ajax.ActionLinkを使用することをお勧めします
- 26. ADO.NETコマンドオブジェクトを再利用することをお勧めしますか?
- 27. IOS facebookとtwitterを使用してログインすることをお勧めします
- 28. MongoDBエンティティIDとして_idを使用することをお勧めします
- 29. getPreviousNodeを使用せずにこのLinkedListを試してみることをお勧めします。
- 30. node.jsを使用してフォーラムを構築することをお勧めしますか?
なぜフレームワークによって提供されるSessionContextを使用しないでください? –
@Marcos、あなたはSessionContextがJavaによって提供されていると言っていますか?申し訳ありませんが、あなたが参照しているフレームワークを取得していません... – peakit
私は彼がHttpSessionおよび/またはServletContext(アプリケーションスコープ)を参照していたと思います。 – jhouse