2010-04-09 2 views
3

Я написал систему авторизации, которая полагается на объекты, представляющие текущего пользователя. Для упрощения программирования и повышение производительности я хочу, чтобы держать эти объекты в ThreadLocal после того, как пользователь вошел вThreadLocal (и Singleton) в контейнере EJB

Это выглядит следующим образом:.

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 является классическим кандидатом на одноэлемент, потому что приложение нуждается только в одном экземпляре. Но, насколько я знаю, EJB @Singleton имеют такое же поведение в кластере.

Итак, что делать, чтобы сделать UserCache скомпилированным в среде EJB 3.1 (Java EE 6)?

Solutions, извлеченные из ответов:

  • Использование SessionScope от КДИ (JSR 299) или
  • Использование виртуальной машины Java кластеризацию с Terracotta

ответ

5

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

1

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

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

+0

Вы правы, мой подход с локальным потоком не имеет особого смысла в кластере. Поэтому мне придется пойти с терракотой или CDI SessionScope, как предлагает chris_l. – deamon

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

Это не может быть проблемой здесь, хотя.

 Смежные вопросы

  • Нет связанных вопросов^_^