2010-04-09 14 views
3

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

Répondre

5

Puisque vous êtes déjà sur Java EE 6, ne serait-il encore beaucoup plus facile à utiliser CDI (Contextes et Injection de Dépendance). Cela permettrait de mettre l'information de l'utilisateur dans le session scope, et de l'injecter facilement partout. CDI gère le reste pour vous.

1

qui ne devrait pas vous causer un problème, Parce que les threads ne couvrent pas les différents nœuds de toute façon - ou est-ce que je ne comprends pas le point de votre question?

edit: vous pouvez regarder en quelque chose comme la terre cuite - http://www.terracotta.org/ - des moyens que vous pouvez CLUSTER objets existants

+0

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

1

Si vous avez besoin de partager des objets entre les nœuds, je vous suggérerais également de regarder les frameworks existants (comme Terracotta).

Aussi, en utilisant ThreadLocal pourrait éventuellement causer des problèmes différents:

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

Cela peut ne pas être un problème ici, cependant.