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 :

Retour Hibernate aléatoire


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut Retour Hibernate aléatoire
    Bonjour

    je suis dans le développement d'un site JavaEE avec MySql, et Hibernate (3) réagit bizarrement :
    Lorsque je multiplie les appels au Dao (toujours de la même manière, en boucle, pour incrémenter un total par exemple) il arrive (1 fois sur 10) que les objets ne soient pas récupérés, ou bien dans un état précédent(avec un total faussé donc).

    Le problème semblerai venir d'un cache hibernate.
    J'ai ajouté des session.flush() mais ca n'a pas aidé.
    Je me demande si ca peut venir de mon hibernateUtil, ou bien de mon mapping peut etre ?...


    Tous vos commentaires / liens sont les bienvenus.
    Merci !

    HibernateUtile :
    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
    35
    36
    37
     
     
    	private static Log					log					= LogFactory.getLog(HibernateUtile.class);
     
    	private static final SessionFactory sessionFactory;
     
    	static {
    		try {
    			// Crée la SessionFactory
    			sessionFactory =
    				new Configuration().configure().buildSessionFactory();
    		} catch (HibernateException ex) {
    			throw new RuntimeException("Problème de configuration : "
    					+ ex.getMessage(), ex);
    		}
    	}
     
    	public static final ThreadLocal session = new ThreadLocal();
     
    	public static Session getSession()
    	throws HibernateException {
    		Session s = (Session) session.get();
    		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
    		if (s == null) {
    			s = sessionFactory.openSession();
    			session.set(s);
    		}
    		return s;
    	}
     
    	public static void closeSession()
    	throws HibernateException {
    		Session s = (Session) session.get();
    		session.set(null);
    		if (s != null)
    			s.close();
    	}
    Mon dao
    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
     
    Compte compte = null;
     
    		try {
     
    			Session session = HibernateUtile.getSession();
     
    			Query query = session.createQuery("from Compte where profil=:profil and partenaire.code=:code");
     
    			query.setString("profil", profil);
    			query.setString("code", codePartenaire);
     
    			compte = (Compte) query.uniqueResult();
     
    .....
    ma config hibernate
    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
     
    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
    <hibernate-configuration>
    	<session-factory>
    		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property>
    		<property name="hibernate.connection.username">root</property>
    		<property name="hibernate.connection.password">root</property>
    		<property name="show_sql">false</property>
    		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     
            <property name="current_session_context_class">thread</property>
            <property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property>
     
    		<!-- Mapping files -->
            <mapping resource="fr/globalaction/hibernate/Action.hbm.xml" />
    ......
    	</session-factory>
    </hibernate-configuration>
    un exemple de Dao
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    	Session session = HibernateUtile.getSession();
     
    	Query query = session.createQuery("from Compte where profil=:profil and partenaire.code=:code");
     
    	query.setString("profil", profil);
    	query.setString("code", codePartenaire);
     
    	compte = (Compte) query.uniqueResult();

  2. #2
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut
    Essaies d'ajouter ces propriétés dans ton fichier hibernate.cfg.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <property name="hibernate.cache.use_query_cache">false</property>
    <property name="hibernate.cache.use_second_level_cache">false</property>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    Merci de ta réponse

    les deux lignes que tu m'as précisé correspondent apparemment au cache de second niveau. J'ai lu qu'il n'était pas actif par défaut, mais j'essaye quand même dès que j'arrive a redémarrer mon tomcat a cause d'une erreur filterStart ...

  4. #4
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut
    La première ligne concerne le query_cache utilisé prioritairement par Hibernate pour les requête de type session.createQuery("..") comme tu le fais dans ton Dao.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    Et ca ne résout pas mon problème ...

    Merci quand même ! Je cherche toujours ..

    (et pour le filterStart, Struts 2 a besoin de freemarker.jar mais c'est une autre historie .. )

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    Est ce qu'il pourrait y avoir un lien avec mes hashCode et equals ?
    (Puisqu'ils peuvent générer des erreurs "existing object with same identifier.." )

    Lorsque je les génère, je n'inclue pas les relations a 1-n, n-1 et n-n.

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu stocke tes session dans un threadlocal. Tu n'oublierais pas de faire des session.close() après la requete utilisateur par hasard? Losqu'une session a chargé un objet, elle n'ira plus jamais sur la db recharger cet objet (à mois de passer par session.evict ou session.merge). Donc si tu oublie le close et que tu le laisse dans le threadlocal, il est possible qu'une requete http suivante réutilise cette session, et donc récupère l'objket dans l'état où la session le connait.

    Enfin, si tu as des requetes en //, n'oublie pas que tu dois les isoler l'une de l'autre pour ne pas corromptre ta base de donnée. Pour ça, l'utilisation de transaction et d'un niveau d'isolation suffisant de celle-ci (config au niveau du datasource ou de hibernate)

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    Merci de ta réponse !

    mes sessions sont bien fermés.

    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
     
    public List<Total> getTotauxParPartenaireIdEtMois(int partenaireId, String mois) throws GaException {
     
    		log.debug("getTotauxParPartenaireIdEtMois - " + partenaireId + "/" + mois);
    		try {
     
    			Session session = HibernateUtile.getSession();
    			Query query = session.createQuery("from Total where periode=:mois and partenaireId=:partenaireId");
    			query.setInteger("partenaireId", partenaireId);
    			query.setString("mois", mois);
     
    			List<Total> result = new ArrayList<Total>();
     
    			result.addAll(query.list());
     
    			for (Iterator<Total> iterator = result.iterator(); iterator.hasNext();) {
    				Total total = iterator.next();
    				log.info("total " + total.getType() + " " + total.getTotal());
    			}
     
    			return result;
     
    		} catch (RuntimeException e) {
    			log.error("Error - " + e.getMessage());
    			e.printStackTrace();
    			throw e;
    		} finally {
    			HibernateUtile.closeSession();
    		}
    	}
    et mon HibernateUtile :

    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
    35
    36
    37
    38
     
     
    public class HibernateUtile {
     
    	private static final SessionFactory sessionFactory;
     
    	static {
    		try {
    			// Crée la SessionFactory
    			sessionFactory =
    				new Configuration().configure().buildSessionFactory();
    		} catch (HibernateException ex) {
    			throw new RuntimeException("Problème de configuration : "
    					+ ex.getMessage(), ex);
    		}
    	}
     
    	public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
     
    	public static Session getSession()
    	throws HibernateException {
    		Session s = (Session) session.get();
    		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
    		if (s == null) {
    			s = sessionFactory.openSession();
    			session.set(s);
    		}
    		return s;
    	}
     
    	public static void closeSession()
    	throws HibernateException {
    		Session s = (Session) session.get();
    		session.set(null);
    		if (s != null)
    			s.close();
    	}
    	}

    ... qu'appelles-tu des requetes // ?

    Merci

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    eds requetes qui se font en même temps. Ce que tu dois d'office prévoir en environnement web, puisque ça surviens dès que deux utilisateur font une opération en même temps.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    ok merci

    c'est ptet ca le problème.
    Je n'utilise la transaction que pour les save, update, saveOrUpdate. J'essayerai de l'ajouter pour les select.

    Pour finir, est ce que ma transaction est bien utilisée comme ca : ?
    (HibernateUtile et configuration hibernate sont dans les posts précédents)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try {
    			Session session = HibernateUtile.getSession();
    			Transaction transaction = session.beginTransaction();
    			session.saveOrUpdate(applet);
    			transaction.commit();
    		} catch (RuntimeException e) {
    			log.error("Error - " + e.getMessage());
    			e.printStackTrace();
    			throw e;
    		} finally {
    			HibernateUtile.closeSession();
    		}
    Merci pour tout !

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    oula: il sort d'ou le applet, bien de la même session?. Tu ne dois jamais réutiliser un objet détaché d'une session, il ne sont pas mis à jour en mémoire par hibernate! Sinon, imagine ceci:


    Session
    prendre objet X
    fin de session

    **autre thread**
    session
    prendre objet X, le modifier, le sauver
    fin de session
    ** fin autre thread, retour premier thread**
    Session
    sauver X
    fin de session.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    j'ai bien imaginé ce cas la. A vrai dire, je me suis basé sur les sources que j'ai récupéré de mon dernier client, un gros webmarchand.
    Le grosse différence est la présence d'ejb pour accéder aux Dao. Mais je ne pense pas que ca change quelquechose.

    Le test de ce cas, je l'ai fait avec succès sur une seule machine, en utilisant firefix en parallèle d'IE.

    Si tu as une bonne doc hibernate la dessus ca m'intéresse. Sinon je vais me plonger dans la doc officielle.

    Merci encore

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    re !

    J'ai mis tout mon traitement (récupération de l'objet puis update) dans le Dao, et le problème persiste.

    J'ai mieux identifier le problème : entre deux requetes, je recharge la page de mon navigateur pour effectuer ma simulation, et c'est ca qui perturbe mes données. Mais je ne comprends pas vraiment pourquoi.

    Merci encore de votre aide a tous.

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    faut êter plus précis sur ce qui foire. Tu garde tes objet hibernante en session HTTP? C'est à éiter autant que possible.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    Effectivement, je ne comptais pas m'arreter la.

    Tu veux dire qu'il vaut mieux passer par des DTO dès qu'on sort de la couche hibernate ?

    En l'occurrence, mon dao qui foire recoit juste un montant, qu'il ajoute a un total. Donc le dao récupère l'objet Total, incrémente une valeur, puis l'update.

    Lorsque je rafraichis ma page pour rappeler ce même dao, le Total n'est pas toujours

    un petit exemple de mes logs du dao, j'incrémente les totaux de 1 a chaque fois :

    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
     
    2010-08-11 13:54:14 INFO  [PartenaireDao] Nouveaux totaux : 1.00
    2010-08-11 13:54:14 INFO  [PartenaireDao] Nouveaux totaux : 1.00
    2010-08-11 13:54:19 INFO  [PartenaireDao] enregistrerDon
    2010-08-11 13:54:19 INFO  [PartenaireDao] Totaux incrémentés : 2.00
    2010-08-11 13:54:19 INFO  [PartenaireDao] Totaux incrémentés : 2.00
    2010-08-11 13:54:26 INFO  [PartenaireDao] enregistrerDon
    2010-08-11 13:54:26 INFO  [PartenaireDao] Totaux incrémentés : 3.00
    2010-08-11 13:54:26 INFO  [PartenaireDao] Totaux incrémentés : 3.00
    2010-08-11 13:54:33 INFO  [PartenaireDao] enregistrerDon
    2010-08-11 13:54:33 INFO  [PartenaireDao] Totaux incrémentés : 4.00
    2010-08-11 13:54:33 INFO  [PartenaireDao] Totaux incrémentés : 4.00
    2010-08-11 13:54:36 INFO  [PartenaireDao] enregistrerDon
    2010-08-11 13:54:36 INFO  [PartenaireDao] Totaux incrémentés : 3.00
    2010-08-11 13:54:36 INFO  [PartenaireDao] Totaux incrémentés : 3.00

  16. #16
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    la "récupération, incrémentation, update" se fait bien dans une seule transaction hibernate? Avec un isolation de type SERIALIZABLE au niveau JDBC? Il pourrait être utilie dans ton log que tu affiche aussi le thread concerné et le hashcode d'origine de l'objet (System.identityHashcode(objet)) que tu update + de la session, on y verrais plus clair sur qui fait quoi

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    la "récupération, incrémentation, update" se fait bien dans une seule transaction hibernate?
    sir, yes, sir !

    Avec un isolation de type SERIALIZABLE au niveau JDBC?
    Mes objets mappés implémentent Serializable, oui


    Il pourrait être utilie dans ton log que tu affiche aussi le thread concerné et le hashcode d'origine de l'objet (System.identityHashcode(objet)) que tu update + de la session, on y verrais plus clair sur qui fait quoi
    Je ne passe pas explicitement par un thread, j'accède uniquement a la session a laquelle j'associe une transaction :

    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
     
    		try {
    			Session session = HibernateUtile.getSession();
    			Transaction transaction = session.beginTransaction();
     
    			Query query = session.createQuery("...");
    ...
    			List<Total> totauxPartenaire = query.list(); 
     
    				for (Iterator<Total> iterator = totauxPartenaire.iterator(); iterator.hasNext();) {
    					Total total = iterator.next();
    ...
    					session.update(total);
     
    ...
    				}
    			}
    			transaction.commit();
     
    		} catch (RuntimeException e) {
    			log.error("Error - " + e.getMessage());
    			e.printStackTrace();
    			GaException gae = new GaException(e);
    			throw gae;
    		} finally {
    			HibernateUtile.closeSession();
    		}
    System.identityHashcode(objet) je ne connais pas, je cherche comment l'utiliser

    "Que j'update plus de la session" ? qu'est ce que tu veux dire par la ?


    Merci de ton aide encore une fois

  18. #18
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par _Babar_ Voir le message
    Mes objets mappés implémentent Serializable, oui
    Rien à voir, je demande ton isolation jdbc, ce qui permettra de déterminer si oui ou non tu a autorisé les dirty read, les phantom read, etc. Bref tout ce qui peux corrompre une DB

    Je ne passe pas explicitement par un thread, j'accède uniquement a la session a laquelle j'associe une transaction :
    non mais ton conteneur associe un thread à chaque connexion http entrante (d'ou l'utilisation de ton threadlocal), il serait bon d'afficher le nom du thread histoire qu'on sache qui fait quoi! Affiche aussi les requete hibernate (show_sql = true) pur qu'on voie ce que fait hibernate pendant ce temps.
    System.identityHashcode(objet) je ne connais pas, je cherche comment l'utiliser
    ca renvoie un int, t'as qu'à l'afficher

    "Que j'update plus de la session" ?
    Le hashcode du bean que tu update + le hashcode de la session, qu'on voie les deux
    Le premier permettra de voir si oui ou non on recycle un bean, le deuxième si oui ou non on recycle une session...

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Par défaut
    ok ! par défaut l'isolation jdbc était REPEATABLE READ, je l'ai configurée en SERIALIZABLE, et j'obtiens des erreurs dès la première requete, après un timeout d'environ 2 minutes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Could not execute batch update
    ...
    Caused by: java.sql.BatchUpdateException: Lock wait timeout exceeded; try restarting transaction
            at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2018)
            at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1454)
            at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
            at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
            ... 55 more
    mais je comprends pas :/
    Selon mes recherches ca correspond a un problème de plusieurs transactions qui s'emmelent, pourtant je pense n'utiliser qu'une transaction :

    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
     
    		try {
    			Session session = HibernateUtile.getSession();
    			Transaction transaction = session.beginTransaction();
     
    			Query query = session.createQuery("...");
    ...
    			List<Total> totauxPartenaire = query.list(); 
     
    				for (Iterator<Total> iterator = totauxPartenaire.iterator(); iterator.hasNext();) {
    					Total total = iterator.next();
    ...
    					session.update(total);
     
    ...
    				}
    			}
    			transaction.commit();
     
    		} catch (RuntimeException e) {
    			log.error("Error - " + e.getMessage());
    			e.printStackTrace();
    			GaException gae = new GaException(e);
    			throw gae;
    		} finally {
    			HibernateUtile.closeSession();
    		}
    Est ce que c'est parce que je fais un select de plusieurs lignes ?

  20. #20
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    t'as une transaction qui te bloque, probablement lancée par une autre méthode et / ou un autre session. Dans le code que tu présente tu n'a qu'une seule transaction. L'erreur que tu sort ne fait que démontrer ce qui se soupconne depuis le début, t'as des modifications concurrente entre plusieurs sessions hibernate. C'est probablement un transaction pas terminée lors d'une autre requete qui pose problème.

Discussions similaires

  1. Influencer un nombre aléatoire (le retour)
    Par memento80 dans le forum Langage
    Réponses: 10
    Dernier message: 26/12/2011, 19h49
  2. Retour à la ligne avec fichier à accès aléatoire
    Par mehdiyou dans le forum VB.NET
    Réponses: 11
    Dernier message: 29/04/2008, 14h57
  3. Eclipse et Hibernate : le retour :'(
    Par chapioupiums dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/01/2007, 16h40
  4. Retour aléatoire sur la page d'accueil
    Par ThunderBolt_ dans le forum Langage
    Réponses: 2
    Dernier message: 09/01/2007, 10h00

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