我编写了一个授权系统,它依赖于代表当前用户的对象。为了简化编程并提高性能,我想在用户登录后将这些对象保存在 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 或
- 将 JVM 集群与 Terracotta 一起使用