java - EJB 容器中的 ThreadLocal(和 Singleton)

标签 java multithreading jakarta-ee ejb-3.0 thread-local

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

相关文章:

java - 如何通过 CLI 客户端获取 jboss 用户列表

java - 离开应用程序时,必须删除 SharedPreferences

java - 如何在 spring 中触发 Async TransactionalEventListener

c# - 在哪里放置栅栏/内存屏障以保证新的读取/提交的写入?

java - HashMap 中的每键锁而不是整个映射锁

mysql - EJB/Hibernate 不访问 MySQL 数据库

java - 调度程序 servlet 未找到过滤器中重写的 url

java - 正则表达式查找部分输入是否是有效的 JSON

java - 通过扩展线程类创建线程时出现困惑

Javax REST 响应实体 = null