ThreadLocal (y Singleton) en contenedor EJB
-
25-09-2019 - |
Pregunta
He escrito un sistema de autorización que se basa en objetos que representan al usuario actual.Para simplificar la programación y aumentar el rendimiento, quiero mantener esos objetos en un ThreadLocal después de que el usuario haya iniciado sesión.
Se parece a esto:
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);
}
}
He leído que los elementos estáticos hacen que la agrupación en clústeres sea problemática.Si tenía un UserCache en cada nodo del clúster, todos tenían su propio objeto de caché no sincronizado con los objetos de caché de otros nodos.¿Bien? UserCache
es un candidato clásico para un singleton, porque la aplicación solo necesita una instancia del mismo.Pero hasta donde yo sé, los EJB @Singleton tienen el mismo comportamiento en un clúster.
Entonces, ¿qué hacer para que UserCache se pueda agrupar en un entorno EJB 3.1 (Java EE 6)?
Soluciones extraídas de las respuestas:
- Usando SessionScope desde CDI (JSR 299) o
- Uso de agrupación en clústeres JVM con Terracotta
Otros consejos
Eso no debería causarle un problema, porque los subprocesos no abarcan diferentes nodos de todos modos, ¿o me estoy perdiendo el sentido de su pregunta?
editar :es posible que quieras buscar algo como terracota. http://www.terracota.org/ - para conocer formas de agrupar objetos existentes
Si necesita compartir objetos entre los nodos, yo también os recomiendo mirar los marcos existentes (como terracota).
Además, el uso ThreadLocal, posiblemente, podría causar problemas diferentes:
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
Esto no puede ser un problema aquí, sin embargo.