ThreadLocal (и Singleton) в контейнере EJB - PullRequest
3 голосов
/ 09 апреля 2010

Я написал систему авторизации, которая опирается на объекты, представляющие текущего пользователя. Чтобы упростить программирование и повысить производительность, я хочу держать эти объекты в 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)?

Решения, извлеченные из ответов:

  • Использование SessionScope из CDI (JSR 299) или
  • Использование кластеризации JVM с терракотой

Ответы [ 3 ]

5 голосов
/ 09 апреля 2010

Поскольку вы уже работаете в Java EE 6, не будет ли намного проще использовать CDI (внедрение контекстов и зависимостей). Это позволило бы поместить информацию о пользователе в область действия и легко внедрить ее везде. CDI управляет всем остальным.

1 голос
/ 09 апреля 2010

Если вам нужно обмениваться объектами между узлами, я бы также предложил взглянуть на существующие фреймворки (например, 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

Хотя это может и не быть проблемой.

1 голос
/ 09 апреля 2010

, это не должно вызывать у вас проблемы, потому что потоки в любом случае не охватывают разные узлы - или я упускаю суть вашего вопроса?

edit: возможно, вы захотите взглянуть на что-то вроде терракоты - http://www.terracotta.org/ - способы кластеризации существующих объектов

...