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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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)

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