我编写了一个授权系统,它依赖于代表当前用户的对象。为了简化编程并提高性能,我想在用户登录后将这些对象保存在 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 为您管理其余部分。
关于java - EJB 容器中的 ThreadLocal(和 Singleton),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2607019/