私の知る限り、サーブレット3の仕様では非同期処理機能が導入されています。特に、これは、同じスレッドが別の同時HTTPリクエストを処理するために再利用できることを意味します。これは、少なくとも以前にNIOで働いたことのある人にとっては革命的ではありません。
とにかく、これは別の重要なことにつながります。リクエストデータの一時ストレージとしての変数はありません。ThreadLocal
同じスレッドが突然別のHTTPリクエストのキャリアスレッドになると、リクエストローカルデータが別のリクエストに公開されるためです。
それはすべて、記事を読んだことによる私の純粋な推測であり、サーブレット3の実装(Tomcat 7、GlassFish 3.0.Xなど)で遊ぶ時間がありません。
だから、質問:
ThreadLocal
リクエストデータを保持するための便利なハックではなくなると思いますか?- 誰かがサーブレット3の実装のいずれかで遊んで
ThreadLocal
、上記を証明するためにsを使用しようとしたことがありますか? - HTTPセッション内にデータを保存する以外に、アドバイスできる同様の簡単にアクセスできるハックはありますか?
編集:私を誤解しないでください。私は危険とThreadLocal
ハックであることを完全に理解しています。実際、私は常に同じような状況でそれを使用することはお勧めしません。ただし、信じられないかもしれませんが、スレッドコンテキストは、おそらく想像するよりもはるかに頻繁に使用されています。良い例はOpenSessionInViewFilter
、JavadocによるとSpringのものです。
このフィルターは、トランザクションマネージャーによって自動検出される現在のスレッドを介してHibernateセッションを利用できるようにします。
これは厳密にThreadLocal
はチェックされていませんが(ソースをチェックしていません)、すでに憂慮すべきことに聞こえます。私はもっと似たシナリオを考えることができます、そしてウェブフレームワークの豊富さはこれをはるかに可能性の高いものにします。
簡単に言えば、多くの人々は、意識の有無にかかわらず、このハックの上に砂の城を建てました。したがって、スティーブンの答えは理解できますが、私が求めているものとはまったく異なります。誰かが実際に試みて失敗した行動を再現できたかどうかを確認したいので、この質問は同じ問題に巻き込まれた他の人への参照点として使用できます。