スプリングMVCとスレッドセーフについて質問があります。
Tomcatに保存されるWebアプリケーションを開発しています。私が正しく理解していれば、Tomcatはリクエストごとにスレッドを作成し、スレッドプールがあります。現在、ディスパッチャサーブレットはリクエスト間で共有されており、おそらくスレッドセーフです。
しかし、私がこのようなコントローラーを作成すると、次のようになります。
@Controller
@RequestMapping("/manage")
public class QuestionManagementController {
彼はSingleton
スコープを持っているので、すべてのユーザーからのすべてのリクエストで同じコントローラーが使用されます。
私はこの問題が通常どのように解決されるのか疑問に思っています:
1:コントローラーはSession
スコープで作成されていますか?(ただし、1人のユーザーがコントローラーの競合状態につながる可能性のあることをすばやく実行すると、問題が発生する可能性もあると思います)。
2:コントローラーのスコープは次のとおりですrequest
3:クラスレベルで変数を共有しない、または読み取り専用モードにするステートレスコントローラーを作成する
または、この種の問題を解決するためのより良い「ベストプラクティス」があるかもしれません。
私はこの質問をしています。これは、スコープが設定されSingleton
ており、ほとんどのメソッドでデータベース内のユーザーをクエリしているため、スコープが原因でこの情報をクラスレベルの変数に格納できないという問題があるためです。スレッドセーフなコレクションを使用することもできますが、後で同期アクセスを必要とする他のリソースが存在する可能性があります。