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 :

Problème de cache


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut Problème de cache
    Hello,

    Je patauge sur un problème que je soupçonne venir du cache...

    J'utilise:
    JDK 6
    Mysql 5.0
    Hibernate

    Mon but:
    J'ai un programme mutli-thread. Un thread va peupler la base de donnée, un second reprendre ces infos stockées pour les utiliser. La base de donnée est utilisée comme intermédiaire, car ces threads pourraient ne pas s'executer en même temps...

    Bref, ces threads fonctionnent très bien séparéments (j'en lance un, il se termine, je lance le second). Mais dès qu'ils tournent ensemble, voilà ce qui se passe.

    Mon premier thread insère des données dans la base (je les vois avec SQL Manager 2007).
    Mon secon lit la base, mais ne voit pas ces données. C'est comme si elles n'existaient pas!

    J'ai voulu désactiver le cache, j'ai procédé comme suit:
    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>
    <property name="hibernate.cache.use_structured_cache">false</property>
    Mon code JAVA qui lit dans la base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Session session = HibernateUtil.currentSession();
    session.clear();
     
    Query query = session.createQuery("from RawMessage as raw");
    query.setCacheMode(CacheMode.IGNORE);
    query.setCacheable(false);
    List<RawMessage> rawMessages;
    rawMessages = query.list();
    et cette list est toujours vide.

    Il faut comprendre que ce code s'exécute une fois quand il n'y a pas encore les données, ensuite les données sont insérées, puis ce code s'exécute à nouveau. Mais lors de cette seconde exécution, il doit chercher dans un cache quelconque, vu qu'il ne trouve pas de données...

    Je présume que mon problème est lié à la lecture et non à l'écriture, car sinon je ne verrais pas mes données dans la base avec SQL Manager?!?

    J'ai aussi essayé, sur le serveur MySql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set global query_cache_size=0;
    Bref, je suis vraiement coincé...

    Une idée??

  2. #2
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Peut-être faudrait-il regarder du côté :

    • de la transaction (est-ce que le commit a bien eu lieu avant que le 2ème thread ne tente de lire les données ?)
    • et du niveau d'isolation (dirty read ? commited read ?) pour le thread en lecture

  3. #3
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut
    • de la transaction (est-ce que le commit a bien eu lieu avant que le 2ème thread ne tente de lire les données ?)
      Oui, certain!
    • et du niveau d'isolation (dirty read ? commited read ?) pour le thread en lecture
      Que veut-tu dire? Je ne connais pas cela...

  4. #4
    Membre expérimenté Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut
    Pour l'explication sur l'isolation des transactions (le "I" dans "ACID") : voir ici

    Concernant Hibernate le niveau d'isolation transactionnel se configure dans le fichier de configuration (hibernate.cfg.xml) via le paramètre connection.isolation comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <!-- DB JDBC connection properties --> 
    <!-- Transaction isolation 2 = READ_COMMITTED --> 
    <property name="connection.isolation">2</property>

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je ne pense pas que ça vienne de là puisqu'il dit que le commit a été fait.
    Le niveau d'isolation est pour les enregistrements en attente de validation, pas pour ceux qui l'ont été...

    Peux-tu tout de même montrer le code d'écriture ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut
    Le code d'écriture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            Transaction tx = session.beginTransaction();
            for(RawMessage message : rawMessages) {
                session.save(message);
            }
            this.setActive(false);
            session.update(this);
            tx.commit();

Discussions similaires

  1. problème de cache lors du chargement d'applet
    Par ellocin dans le forum Applets
    Réponses: 4
    Dernier message: 05/04/2007, 12h31
  2. [Tomcat 5.5.16] Problème de cache
    Par vallica dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 29/05/2006, 14h59
  3. Problème Mémoire Cache
    Par Ryadus dans le forum Ordinateurs
    Réponses: 6
    Dernier message: 13/12/2005, 16h21
  4. Problème de cache avec Oracle 8i
    Par lper dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/11/2004, 16h50
  5. Problème de cache avec oracle 8 i
    Par lper dans le forum Oracle
    Réponses: 11
    Dernier message: 08/11/2004, 16h45

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