J'ai écrit un système d'autorisation qui repose sur des objets représentant l'utilisateur actuel. Pour simplifier la programmation et augmenter les performances que je veux tenir ces objets dans un ThreadLocal après que l'utilisateur a ouvert une sessionThreadLocal (et Singleton) dans le conteneur EJB
Il ressemble à ceci:.
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);
}
}
J'ai lu que des éléments statiques rendent le regroupement problématique. Si j'avais un UserCache sur chaque nœud de cluster, ils avaient tous leur propre objet de cache non synchronisé avec les objets de cache sur d'autres nœuds. Droite? UserCache
est un candidat classique pour un singleton, car l'application n'a besoin que d'une seule instance. Mais autant que je sache, les EJB @Singleton ont le même comportement dans un cluster.
Alors, que faire pour rendre UserCache cliquable dans un environnement EJB 3.1 (Java EE 6)?
Solutions extraites des réponses:
- En utilisant SessionScope de CDI (JSR 299) ou
- Utilisation du clustering JVM avec terre cuite
Vous avez raison, mon approche avec thread local n'a pas beaucoup de sens dans un cluster. Je vais donc devoir aller avec de la terre cuite ou CDI SessionScope, comme le suggère chris_l. – deamon