Hibernate Books

All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 2 posts ] 
Author Message
 Post subject: Problème de cache: les nouvelles entités n'apparaissent pas
PostPosted: Tue Nov 04, 2014 10:56 am 
Newbie

Joined: Tue Nov 04, 2014 10:41 am
Posts: 2
Bonjour,
Cela fait plusieurs mois que je développe une webapp utilisant hibernate et je me trouve face à un problème que je n'arrive pas à expliquer: Lorsque j'ajoute une entité, celle-ci n'apparait pas dans la liste des entités que je récupère après l'avoir ajouté (en utilisant une session différente pour la création / listing). Si je re-éxecute plusieurs fois la requête, elle fini par apparaitre dans la liste, parfois disparait. C'est de même pour la modification d'une colonne: si je change la propriété "nom" (un String) d'une entité (ou bien une relation 1->n), parfois le vieux nom apparait, parfois le nouveaux. Si je redémarre le serveur, tout rentre dans l'ordre (j'utilise spring-mvc avec des controlleurs rest).
J'ai bien vérifier que le cache lvl 2 soit désactivé.
Si je recréé une nouvelle SessionFactory à chaque ouverture de session, cela fonctionne (mais bien sur ce n'est absolument pas le but - c'était juste pour tester).

Voici mon fichier de config hibernate

Code:
      <!-- Database connection settings -->
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
      <property name="connection.username">xxxxx</property>
      <property name="connection.password">xxxxx</property>

      <!-- JDBC connection pool (use the built-in) -->
      <property name="connection.pool_size">1</property>

      <!-- SQL dialect -->
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

      <!-- Enable Hibernate's automatic session context management -->
      <property name="hibernate.current_session_context_class">thread</property>

      <property name="hibernate.cache.use_query_cache">false</property>
      
      <!-- Disable/Enable the second-level cache  -->
      <property name="hibernate.use_second_level_cache">false</property>
      <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
      
      <!-- Drop and re-create the database schema on startup -->
      <property name="hbm2ddl.auto">update</property>

      <!-- Echo all executed SQL to stdout -->
      <property name="hibernate.show_sql">true</property>



Et voici le simple test que j'effectue pour me rendre compte que cela ne fonctionne pas:

Code:
      // créé les composants de l'option et vérifie qu'elles existent après la création
      TypeEntite1 entite1 = new TypeEntite1(0L,"entite1",ecole, annee);
      Session session = HibernateUtil.getInstance().getSessionFactory().openSession();
      session.beginTransaction();
      session.save(entite1);
      session.getTransaction().commit();
      session.close();
      checkOptionComposantExist("entite1", TypeEntite1.class); // la première entité ajouté est toujours retrouvée dans la liste
      
      
      TypeEntite2 entite2 = new TypeEntite2(0L,"entite2",ecole, annee);
      session = HibernateUtil.getInstance().getSessionFactory().openSession();
      session.beginTransaction();
      session.save(entite2);
      session.getTransaction().commit();
      session.close();
      checkOptionComposantExist("entite2", TypeEntite2.class); // toutes les autres entité ne sont jamais affichée dans la liste


Voici ma méthode qui check si l'entité est bien retrouvée après ajout:
Code:
   private void checkOptionComposantExist(String nomAttendu,Class<? extends OptionAbstract> type){
      
      List<OptionAbstract> optionsComposants = genericDAO.list(type);
      
      if(optionsComposants.size() == 0)
         fail("Aucun éléments d'options trouvé pour le type " + type.getSimpleName());
      
      for(OptionAbstract optionComposant:optionsComposants){
         
         if(optionComposant.getNom().equals(nomAttendu))
            return;
      }
      
      fail("L'élément de l'options de type " + type.getSimpleName() + " avec comme nom " + nomAttendu + " n'a pas été trouvé");
   }


Et voici la méthode qui récupère une liste d'un certain type d'entité:
Code:
   public List list(Class<?> typeParameterClass) {
      Session session = sessionFactory.openSession();
      List records = session.createCriteria(typeParameterClass).list();
      session.disconnect();
      return records;
      
   }


Top
 Profile  
 
 Post subject: Re: Problème de cache: les nouvelles entités n'apparaissent pas
PostPosted: Wed Nov 05, 2014 9:33 am 
Newbie

Joined: Tue Nov 04, 2014 10:41 am
Posts: 2
J'ai modifié deux choses dans mon code qui a presque éliminé ce phénomène:

- lorsque je récupère une liste d'entité avec
Code:
session.createQuery(Class<?>).list()
je créé une transaction, ce qui donne

Code:
Session session = sessionFactory.openSession();
session.beginTransaction();
List res = session.createCriteria(Class<?>).list();
session.getTransaction().commit();
session.close();

Bien que cela ne me semble pas logique (pourquoi créer une transaction et commiter alors qu'on ne fait que lire? Quelque chose m'échappe?) ca fonctionne bien.

- Dans certains cas, je créais plusieurs session au sein du même thread (requête http émise par un client) ce qui provoquais aussi ce bug de cache.

Le bug a presque disparu mais existe toujours: parfois lorsque je supprime des entités via une requête dans spring-mvc, et que je récupère juste après la nouvelle liste des entités (donc une nouvelle requête/session via spring-mvc), les anciennes entité apparaissent toujours. Si je re-rafraichi cette liste, les anciennes entités ont disparues.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.