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

JPA Java Discussion :

Problème UserTransaction - impossible d'utiliser la même transaction dans plusieurs méthodes différentes


Sujet :

JPA Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème UserTransaction - impossible d'utiliser la même transaction dans plusieurs méthodes différentes
    Bonjour,

    Je développe actuellement une application web à l'aide de GWT et javaEE.
    Dans mon servlet GWT, j'aimerai démarrer une transaction dans une méthode, et finir cette transaction dans une autre méthode.
    Mais le problème et que le status de ma transaction est invalide dès que la première méthode contenant le begin est terminée.

    Voici mon code simplifié :

    la méthode validerPanier() est appelée avant la méthode getMyAdresse().
    La transaction utx est sauvegardée en variable globale de la servlet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public synchronized long validerPanier() {
            try {
                //C est ici que l'on va commencer la transaction, reserver les produits si disponible, sinon retourner une erreur
                Context ctx = new InitialContext();
                utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
                System.out.println(utx.getStatus()); //Status vaut 6
                utx.begin();//Debut transaction
                System.out.println(utx.getStatus()); //Status vaut 0            
                long result = getPanierBean().validerPanier(getLogin());
                return result;
            } catch ....
     
            }
        }
     
    public synchronized List<AdresseFrDTO> getMyAdresse() {
            try {
                System.out.println(utx.getStatus()); //Status vaut 6
            } catch (SystemException ex) {
                ....
            }
             .......
    }

    Merci de votre aide

  2. #2
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    je ne suis pas sur de bien comprendre.............
    mais, pour moi, declarer une transaction en variable globale n'est pas un bon choix.

    D'autre part, ouvrir une connection dans une methode et la fermer dans une autre n'est pas non plus correct.
    Je pense qu'il est mieux ,pour être sur a 100 % que la gestion de creation et fermeture des connections soient correctes, faire dans la meme methode un try catch finallly.
    Dans le try tu ouvres ta connection , transaction,............
    Dans le finally tu fermes tout.

    Si dans le try tu dois appeller une methode qui a besoin de ta connection ou transaction , tu peux la passer en parametre
    Connection cnx = null;
    try{
    //ouverture de connection, transaction .....
    cnx = .....
    maMethode (cnx);
    }
    catch{

    }
    finally{
    // fermeture connection , transacrtion
    if (cnx != null)
    cnx.close();
    }

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci de ton aide.
    En faite, je t'explique pourquoi j'ai besoin de plusieurs méthodes, et pourquoi je ne peut pas les appeler dans un même try.
    En faite je réalise un site d'E-commerce, et à la validation du panier, un méthode valider panier est appelée sur la servlet qui réserve les articles en base de données (en passant par des méthodes contenu dans des ejb).
    Cela amorce une commande, mais attention elle n'est pas complète. Il manque les adresse livraison, type paiement, etc (commande est un entity bean).
    Après quelques cliques dans le navigateur, d'autres méthodes sont appelées, et j'aimerais qu'elles s'exécutent dans la même transaction qu'au départ.
    Comme ça, si l'utilisateur décide de tout annuler, je roolback toutes les modifications réalisées depuis la validation du panier.
    Voila pourquoi j'aimerais utiliser une transaction dans plusieurs méthodes, appelées par le navigateur au fur et à mesure du passage de la commande.

  4. #4
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 67
    Points : 48
    Points
    48
    Par défaut
    je crois que tu es face a uun probleme plus global.
    En fait, tu essaies de garder la meme connection ouverte durant toute la session.
    Imagine que le user ne termine jamais la validation de son panier, ta connection restera ouverte jusqu'au timeout de la session.
    (dans ce cas , encore faut il que tu fasses ton roolback au declenchement du timeout de fin de session).

    De plus , une variable globale d'une servlet est partagée par toutes les connections http sur cette meme servlet (thread safe; une instance de servlet et plusieurs thread sur cette meme instance )) ,

    A ce rythme tu risques d'avoir un pool de connection vite rempli.....
    Dans tout les cas, je ne ferais pas de connection partagée, trop risquée....

    Pourquoi tu ne stockes pas toute les infos dans la session et au moment ou il valide de faire les traitements adequats ?
    Je vois pas trop l'interet de reserver durant la commande.
    C'est au moment de la validation que tu peux contrôler le stock.......


    S'il y a une solution je ne la connais pas

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/05/2008, 09h03
  2. Réponses: 3
    Dernier message: 27/02/2008, 22h58
  3. utiliser les mêmes variable dans plusieurs class
    Par hterrolle dans le forum Langage
    Réponses: 2
    Dernier message: 16/11/2007, 21h11
  4. Réponses: 10
    Dernier message: 08/02/2007, 13h18
  5. utiliser le même fichier dans plusieurs projets vc++6
    Par yannick_sch dans le forum MFC
    Réponses: 5
    Dernier message: 12/02/2004, 17h39

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