Я написал систему авторизации, которая полагается на объекты, представляющие текущего пользователя. Для упрощения программирования и повышение производительности я хочу, чтобы держать эти объекты в 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
Вы правы, мой подход с локальным потоком не имеет особого смысла в кластере. Поэтому мне придется пойти с терракотой или CDI SessionScope, как предлагает chris_l. – deamon