3

現在のユーザーを表すオブジェクトに依存する認証システムを作成しました。プログラミングを簡素化し、パフォーマンスを向上させるために、ユーザーがログインした後、これらのオブジェクトを 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 クラスタリングの使用
4

3 に答える 3

5

すでに Java EE 6 を使用しているため、CDI (Contexts and Dependency Injection) を使用する方がはるかに簡単ではないでしょうか。これにより、ユーザー情報をセッションスコープに入れ、どこにでも簡単に挿入できます。残りはCDIが管理します。

于 2010-04-09T11:51:46.600 に答える
1

とにかく、スレッドは異なるノードにまたがらないため、問題を引き起こすことはありません-または、質問の要点を見逃していますか?

編集:テラコッタのようなものを調べたいと思うかもしれません - http://www.terracotta.org/ - 既存のオブジェクトをクラスター化する方法について

于 2010-04-09T11:41:30.140 に答える
1

ノード間でオブジェクトを共有する必要がある場合は、既存のフレームワーク (Terracotta など) も検討することをお勧めします。

また、ThreadLocal を使用すると、さまざまな問題が発生する可能性があります。

http://forums.sun.com/thread.jspa?threadID=589744 http://www.devwebsphere.com/devwebsphere/2005/06/dont_use_thread.html http://www.theserverside.com/discussions/thread. tss?thread_id=21055

ただし、これはここでは問題ではないかもしれません。

于 2010-04-09T11:54:04.680 に答える