EJB容器中的ThreadLocal(和Singleton)

dea*_*mon 3 java multithreading thread-local java-ee ejb-3.0

我写了一个授权系统,它依赖于代表当前用户的对象.为了简化编程并提高性能,我希望在用户登录后将这些对象保存在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);
    }

}
Run Code Online (Sandbox Code Playgroud)

我已经读过静态元素使聚类成问题.如果我在每个群集节点上都有一个UserCache,则它们都有自己的缓存对象与其他节点上的缓存对象不同步.对?UserCache是单例的经典候选者,因为应用程序只需要它的一个实例.但据我所知,@ Singleton EJB在集群中具有相同的行为.

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

从答案中提取的解决方案:

  • 使用CDI的SessionScope(JSR 299)或
  • 使用Terracotta进行JVM集群

Chr*_*her 5

既然您已经使用过Java EE 6,那么使用CDI(上下文和依赖注入)就不会那么容易了.这将允许将用户信息放在会话范围内,并在任何地方轻松注入.CDI为您管理其余部分.