IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Objet unique par session dans un contexte métier


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut Objet unique par session dans un contexte métier
    Bonjour,

    Voici mon contexte d'application :

    Application J2EE sous Websphère avec :
    - Struts pour la présentation
    - Spring / Hibernate pour le métier
    - Découpage en couche : Business Service et DAO

    L'application tourne dans un contexte multi-utilisateurs. De ce fait, je souhaite avoir un contexte unique persistant pour chaque utilisateur contenant les informations propres à chaque utilisateur.

    Du côté présentation, pas de problème. Je mets mon contexte en session :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().setAttribute( "Contexte", contexte );
    Le problème se pose du côté métier. Je n'arrive pas à avoir d'objet unique accessible partout dans le métier...

    Mon premier essai consistait à stocker mon contexte dans une map multi-thread avec le Thread concerné comme clé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maMap.get( Thread.currentThread() );
    Problème : Avec Hibernate plusieurs Thread peuvent être exécutés pour une transaction... Je ne peux donc pas récupéré mon contexte dans certains cas !

    Mon 2è essai s'orientait sur un singleton avec variable statique... Problème : Le singleton est unique pour tous les utilisateurs !

    Bref, je suis perdu ! Je sais qu'il doit y avoir un moyen de faire ça sans avoir à passer mon contexte en paramètre de toutes mes méthodes métier mais je ne sais pas comment !!
    Peut-être qu'avec Spring, il y aurait un moyen ?

    Merci d'avance à tous pour votre aide...

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Personne n'a une petite idée à me proposer ?
    Je suis vraiment en galère avec cette histoire...

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Citation Envoyé par kikijojo72 Voir le message
    Je sais qu'il doit y avoir un moyen de faire ça sans avoir à passer mon contexte en paramètre de toutes mes méthodes métier mais je ne sais pas comment !!
    Définir un id unique à ton contexte, maintenir une Map accessible statiquement qui contient tous les ids pointant vers tous les contextes actuellement viables.

    C'est à peu près comme ça que marchent l'objet Session lui-même, au passage.
    Mais il serait bien plus simple de juste passer le contexte partout, ou plus exactement, de construire des objets chargés de faire tes actions, et de passer ta session dans leur constructeur, pour qu'ils sachent qu'ils utilisent celle-là.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Merci pour la réponse mais c'est pas pratique.
    Ca impose de passer soit l'id généré soit le contexte en paramètre de toutes les méthodes.
    Je pars d'un existant et les impacts d'un tel changement sont trop grands...

    C'est pourquoi je cherche un autre moyen...

    Mais pendant mes investigations, j'ai vu des choses sur le ThreadLocal. Visiblement, ca serait la solution à mon problème...

    Qu'en pensez-vous ?

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Citation Envoyé par kikijojo72 Voir le message
    Mais pendant mes investigations, j'ai vu des choses sur le ThreadLocal. Visiblement, ca serait la solution à mon problème...
    Ben oui, mais tu avais dit qu'une même action n'était pas forcément liée à un même thread...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par kikijojo72 Voir le message
    Problème : Avec Hibernate plusieurs Thread peuvent être exécutés pour une transaction... Je ne peux donc pas récupéré mon contexte dans certains cas !
    Est ce que tu es sûr de ça ? Les Session et Transaction d'Hibernate ne sont généralement pas thread safe.
    Généralement une requête dans un container s'exécute dans un thread unique et dans ce cas tu peux utiliser le ThreadLocal pour pointer vers l'objet contexte au moment où tu as encore accès à la Session (dans un filtre de servlet par exemple)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par -gma- Voir le message
    Les Session et Transaction d'Hibernate ne sont généralement pas thread safe.
    Généralement une requête dans un container s'exécute dans un thread unique et dans ce cas tu peux utiliser le ThreadLocal pour pointer vers l'objet contexte au moment où tu as encore accès à la Session (dans un filtre de servlet par exemple)
    C'est bien ça. En fait, j'ai mal localisé le problème. J'ai bien un Thread pour une transaction...

    Donc il faut bien que j'utilise le ThreadLocal à chaque transaction pour transporter mes données issues du contexte... C'est bien ça ?

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Citation Envoyé par kikijojo72 Voir le message
    C'est bien ça. En fait, j'ai mal localisé le problème. J'ai bien un Thread pour une transaction...

    Donc il faut bien que j'utilise le ThreadLocal à chaque transaction pour transporter mes données issues du contexte... C'est bien ça ?
    Oui, c'est la seule alternative, et c'est en général comme ça que font les outils.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Un grand merci à tous !! Je clos le sujet...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/10/2013, 13h28
  2. Passer un Objet (pojo) par get dans une url.
    Par Altenide dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 09/11/2010, 12h24
  3. [AC-2003] inserer un objet ole par defaut dans un formulaire
    Par 73brunette73 dans le forum IHM
    Réponses: 4
    Dernier message: 14/01/2010, 08h41
  4. Objet unique et commun dans un WS
    Par kij dans le forum Services Web
    Réponses: 1
    Dernier message: 02/10/2008, 16h22
  5. Valeur par défaut dans une table objet
    Par Ricky81 dans le forum Oracle
    Réponses: 12
    Dernier message: 18/03/2004, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo