我编写了一个授权系统,该系统依赖于代表当前用户的对象。为了简化编程并提高性能,我想在用户登录后将这些对象保留在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)环境中可集群化呢?
从答案中提取的解决方案:
最佳答案
既然您已经在使用Java EE 6,那么使用CDI(上下文和依赖注入(inject))会不会容易得多。这将允许将用户信息放入session scope,并轻松地将其注入(inject)到任何地方。 CDI为您管理其余部分。