Google AppEngineでホストされているオープンソースのCMSであるVosaoCMSのコードを閲覧していて(これは素晴らしいアイデアだと思います)、CurrentUserクラス内で次のコードを見つけました。
/**
* Current user session value cache class. Due to GAE single-threaded nature
* we can cache currently logged in user in static property. Which we set in
* authentication filter.
*/
public class CurrentUser {
private static UserEntity user;
public static UserEntity getInstance2() {
return user;
}
public static void setInstance2(UserEntity aUser) {
user = aUser;
}
}
私はGAEを使ったことがありませんが、これは私には本当に奇妙に聞こえます。
GAEは本当に「シングルスレッド」ですか?GAEを使用する場合、リクエストスコープのデータを静的フィールド内に保存しても安全ですか?
これは、JVMインスタンスごとに、他のすべてのリクエストが待機している間、一度に1つのHTTPリクエストのみが実行されることを意味しますか?
これは一般的なGAEイディオムですか?そうでない場合、リクエストの期間中、そのようなUserEntityを保存するのに最適なGAEイディオムは何でしょうか?Spring Securityのように、ここでThreadLocalを使用するべきではありませんか?または、ある種のスコープ付きBean(依存性注入コンテナーによって管理される)ですか?