現在のユーザーを表すオブジェクトに依存する認証システムを作成しました。プログラミングを簡素化し、パフォーマンスを向上させるために、ユーザーがログインした後、これらのオブジェクトを ThreadLocal に保持したいと考えています。
次のようになります。
public class UserCache {
private static final ThreadLocal<User> cache = new ThreadLocal<User>();
public User getCurrentUser() {
return cache.get();
}
public void setCurrentUser(User user) {
cache.set(user);
}
}
静的要素によってクラスタリングが問題になると読んだことがあります。各クラスター ノードに UserCache がある場合、すべてのクラスター ノードには、他のノードのキャッシュ オブジェクトと同期されていない独自のキャッシュ オブジェクトがありました。右?UserCache
アプリケーションが単一のインスタンスのみを必要とするため、シングルトンの古典的な候補です。しかし、私の知る限り、@Singleton EJB はクラスター内で同じ動作をします。
では、EJB 3.1 (Java EE 6) 環境で UserCache をクラスター化可能にするにはどうすればよいでしょうか?
回答から抽出された解決策:
- CDI (JSR 299) から SessionScope を使用するか、
- Terracotta での JVM クラスタリングの使用