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