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

Hibernate Java Discussion :

Gestion de la concurrence


Sujet :

Hibernate Java

  1. #1
    vny
    vny est déconnecté
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Par défaut Gestion de la concurrence
    Bonjour,

    Me revoilà encore une fois avec mes problèmes sur mon application (struts+hibernate+db oracle sur jonas).
    Cette fois-ci il s'agit de la gestion de la concurrence.

    Je me suis donc plongée dans la doc hibernate mais je suis perdue là.

    J'ai deux tables avec relation père-fils avec un many-to-one et un set inverse="true" de l'autre côté.
    Tout se passe bien jusqu'à ce que je charge l'application (avec JMeter) et obtienne des insertions concurrentes.
    Le test crée 1père avec 1 fils (peu d'interêt j'en convient mais c'est pour le test et la compréhension) et après je me retrouve en db avec :
    - parfois 1 père et plusieurs fils !
    - parfois 1 père sans fils !

    Quelqu'un aurait il la bonté de m'expliquer un petit peu ?

    Merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Par défaut
    Bonjour,

    As tu encapsulé tes opérations au sein d'une transaction hibernate ?

    L'idéal étant:
    • Demarrer la transaction
    • Rendre le fils persistant (si ce n'est pas fait en cascade lorsque lors du stockage du père)
    • Rendre le père persistant
    • Si aucune exception : Commiter la transaction
    • Si exception : Rollback sur la transaction
    • Fin de la transaction


    Ainsi tu devrais constament avoir un état "cohérent" de ta base de données

  3. #3
    vny
    vny est déconnecté
    Membre confirmé
    Inscrit en
    Mai 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 74
    Par défaut oui je pense
    Voici le code de l'action :

    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
     
    Papa newPapa = new Papa();
    newPapa.setCommentaire(newCommentaire);
    Calendar now = Calendar.getInstance();
    newPapa.setCreation(new Timestamp(now.getTimeInMillis()));
    newPapa.setId(getNewId());
     
    for(int i=0 ; i<nbFils ; i++) {
      Fils fils = new Fils();
      fils.setId(getNewId()+i);
      fils.setLePapa(newPapa);
      newPapa.getLesFils().add(fils);
    }  
    Session session = HibernateUtil.getCurrentSession();
    Transaction tr = session.beginTransaction();
    session.save(newDemande);
    tr.commit();
    session.close();
    Sachant que c'ets ma DB qui gère l'Id unique grâce à un trigger (db oracle)

    le mapping de fils
    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
     
    <class name="mypackage.Fils" 
    table="T_FILS"
    dynamic-update="false" 
    dynamic-insert="false" 
    lazy="false">
     
    <id name="id" 
    column="RIN_FILSID" 
    type="int"
    />
     
    <many-to-one
     name="lePapa"
     class="mypackage.Papa"
     not-null="true"
     outer-join="auto"
     update="true"
     insert="true"
    column="RIN_PAPAID"/>
    	</class>
    Et celui de Papa :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <class 
    	name="mypackage.Papa" 
    	table="T_PAPA"
    	dynamic-update="false" 
    	dynamic-insert="false" 
    	lazy="false">
     
    	<id 
    	name="id" 
    	column="RIN_PAPAID" 
    	type="int" />
     
    	<property 
    	name="creation"
    	type="java.sql.Timestamp"
    	update="true"
    	insert="true"
    	access="property"
    	column="LDT_PAPACREATION"/>
     
      <property 
    	name="commentaire"
    	type="java.lang.String"
    	update="true"
    	insert="true"
    	access="property"
    	column="LVC_COMMENTAIRE" />		
     
    	<set name="lesFils" inverse="true" cascade="all" lazy="false">
    		<key column="RIN_PAPAID" not-null="true"/>
    		<one-to-many class="mypackage.Fils"/>
    	</set>
    </class>
    Je viens encore de lancer mon test avec des créations très rapprochées et je me ramasse des exceptions différentes :
    - NonUniqueObjectException: a different object with the same identifier
    - ConstraintViolationException

    Bref rien ne va


    Help,
    Merci d'avance

  4. #4
    Membre averti
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Par défaut
    Je pense que tu devrais éviter de générer toi même tes identifiants du côté du code java.
    Utilise le tag <generator> dans le mapping pour laisser Hibernate gérer les id pour toi.

    Dans ton cas, comme tu utilises les triggers, je suppose que tes triggers font appel à des séquences.
    Voici l'exemple d'un generator d'id hibernate qui se base sur les séquences Oracle tiré de la documentation d'Hibernate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <id name="id" type="long" column="person_id">
            <generator class="sequence">
                    <param name="sequence">le_nom_de_ta_sequence</param>
            </generator>
    </id>
    En laissant hibernate gérer les identifiants, il rempliera lui même l'attribut d'identifiant de ton objet Java un fois celui-ci sauvegardé en base.

    Il existe bien d'autres méthodes pour générer les identifiants avec Hibernate, tu peux les consulter ici :
    Generators

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Par défaut récupérer la valeur d'un trigger
    Salut, j'ai exactement le même problème.
    J'ai défini un trigger et une séquence dans ma base de donnée Oracle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE SEQUENCE ma_sequence INCREMENT BY 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create trigger t_matable_pk
    before insert on matable for each row
    begin
       select concat('4', ma_sequence.nextval) into :new.id from dual;
    end;
    Lorsque j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <id name="id" type="long" column="person_id">
            <generator class="sequence">
                    <param name="sequence">ma_sequence</param>
            </generator>
    </id>
    je récupère bien la valeur de la séquence mais pas celle du trigger.

    Ma question est comment puis-je faire pour récupérer un ID unique généré par une séquence et par la concaténation d'un label (dans ce cas ci la valeur '4')?

    Merci pour votre aide

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 11
    Par défaut
    voila c'est résolu: cf. le thread

Discussions similaires

  1. Gestion de la concurrence
    Par Mynautor dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/10/2006, 10h19
  2. Gestion des accès concurrent
    Par nicoaix dans le forum Access
    Réponses: 3
    Dernier message: 06/07/2006, 15h54
  3. Gestion des accès concurrents à une table
    Par kodo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 20/06/2006, 14h05
  4. [Hibernate] Gestion d'acces concurrents
    Par K-Kaï dans le forum Hibernate
    Réponses: 9
    Dernier message: 01/06/2006, 16h08
  5. Réponses: 3
    Dernier message: 30/05/2006, 19h09

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