我编写了一个授权系统,该系统依赖于代表当前用户的对象。为了简化编程并提高性能,我想在用户登录后将这些对象保留在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在群集中具有相同的行为。

那么如何使UserCache在EJB 3.1(Java EE 6)环境中可集群化呢?

从答案中提取的解决方案:
  • 使用来自CDI(JSR 299)或
  • 的SessionScope
  • 将JVM集群与Terracotta一起使用
  • 最佳答案

    既然您已经在使用Java EE 6,那么使用CDI(上下文和依赖注入(inject))会不会容易得多。这将允许将用户信息放入session scope,并轻松地将其注入(inject)到任何地方。 CDI为您管理其余部分。

    10-06 15:50