3

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

3 回答 3

5

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

于 2010-04-09T11:51:46.600 回答
1

这不应该给你带来问题,因为线程无论如何都不会跨越不同的节点 - 还是我错过了你的问题的重点?

编辑:您可能想研究类似兵马俑的东西 - http://www.terracotta.org/ - 了解可以对现有对象进行聚类的方法

于 2010-04-09T11:41:30.140 回答
1

如果您需要在节点之间共享对象,我还建议您查看现有的框架(如 Terracotta)。

此外,使用 ThreadLocal 可能会导致不同的问题:

http://forums.sun.com/thread.jspa?threadID=589744 http://www.devwebsphere.com/devwebsphere/2005/06/dont_use_thread.html http://www.theserverside.com/discussions/thread。 tss?thread_id=21055

不过,这在这里可能不是问题。

于 2010-04-09T11:54:04.680 回答