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 :

EHCache : Comment tester que cela fonctionne


Sujet :

Hibernate Java

  1. #1
    Membre confirmé Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Par défaut EHCache : Comment tester que cela fonctionne
    Bonjour,

    Je suis en traine de mettre EHCache avec hibernate sur un projet. Je voudrais savoir comment il est possible de tester que cela fonctionne bien (sachant que l'application ne fonctionne pas sur une serveur).

    Pour l'instant j'ai testé deux pistes sans succès :
    - j'ai fait un test untiaire ou j'essaye de charger deux fois le même objet depuis la base. J'ai mis le show_sql à true dans ma conf hibernate et je m'attendais à voir qu'une seule requête passer. Mais j'ai deux requete select qui passe pour charger mes deux objets.
    - J'ai mis des logs avec log4j sur le package "net.sf.ehcache", et j'ai mis le niveau de log à DEBUG. je n'ai pas eu une seule ligne dans les log concernant EHCache.


    Donc ma question est simple comment puis-je tester que cela fonctionne ? (Sachant que je n'ai aucune certitude que ma configuration soit bonne). Est ce que au moins un des deux tests que j'ai fait au dessus aurait du fonctionner ?

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Si tu as deux requêtes, effectivement, il y a des chances que ça ne fonctionne pas.
    Tu utilises un get ou une requête HQL ?
    Fais voir ta conf.

  3. #3
    Membre confirmé Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Par défaut
    C'était une excellente question car j'utilisais une classe déjà existante qui pour ramener un objet spécifique utilisais une requete faite avec des Criteria. J'ai donc remplacé ça par un get et du coup, cela fonctionne.

    Le truc, c'est qu'il va falloir que mon cache retourne des données quand je fais des requete. Je suppose qu'il va donc falloir que je mette en place le cache de requete. C'est bien cela ?

    Merci encore, car j'ai bien galéré sur ce truc.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Voila tu as tout compris.
    Il faut activer le cache de requêtes.
    Tu as un chapitre dans la doc pour cela.
    Bonne chance et n'hésite pas à revenir en cas de problème.

  5. #5
    Membre confirmé Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Par défaut
    OK merci beaucoup encore

  6. #6
    Membre confirmé Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Par défaut
    je rouvre ce post car plusieurs problématiques se posent suite au premier qui a été résolu. Je tente donc de mettre un cache query sur mes objets. J'ai donc mis mon dans mon hibernate.cfg.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <property name="hibernate.cache.use_query_cache">true</property>
    et j'ai ajouté sur ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query.setCacheable(true);
    Donc comme avant impossible d'avoir des logs de debug de ehcache, j'ai donc mis le show_sql à true. Et là, c'est le drame! Quand je fais deux appels successifs à ma fonction il crée deux requete SQL.

    Pour en avoir le coeur net, j'ai mis en place les logs sur mon mysql. Et en effet, je vois bien mes deux select passer.

    Donc première question : Qu'est ce que j'ai oublié pour que le cache de requête fonctionne ?

    J'ai repassé mon test en faisant des get sur les objets et un truc qui m'a étonné c'est qu'il ne fait pas une requete sur l'objet que j'ai demandé de charger mais il fait un select sur ma table sans clause where.

    Donc ma deuxième question (moins urgente ) : Est ce un fonctionnement normal ? Est ce du à la présence du cache (Comme ça il met tous les objets en cache) ? Est ce paramétrable ?

    Merci beaucoup pour vos réponses

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Montre nous ton code, car de ce que tu nous dis, ça devrait fonctionner.

    Pour la requête sans clause where, ça semble étrange. Hibernate ne met pas en cache l'intégralité de tes tables (heureusement), mais seulement les données récupérées.

  8. #8
    Membre confirmé Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Par défaut
    voici ma config dans le hibernate.cfg.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>    
            <property name="current_session_context_class">thread</property>
            <property name="hibernate.connection.autoReconnect">true</property>
            <property name="hibernate.connection.autoReconnectForPools">true</property>
            <property name="hibernate.connection.is-connection-validation-required">true</property>
            <property name="show_sql">true</property>
            <property name="hbm2ddl.auto">update</property>
     
            <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property>
            <property name="hibernate.cache.use_second_level_cache">true</property>
            <property name="hibernate.cache.use_query_cache">true</property>
    je travaille avec hibernate 3.3.1.GA et ehcache 1.3.0

    voici mon fichier ehcache.xml
    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
     
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
     
        <diskStore path="/home/moi/ehcache"/>
     
     
        <cache name="org.hibernate.cache.StandardQueryCache"
            maxElementsInMemory="1000" 
            timeToLiveSeconds="3600" 
            timeToIdleSeconds="3600"
            overflowToDisk="false" 
            eternal="false" />
     
        <cache name="org.hibernate.cache.UpdateTimestampsCache"
            maxElementsInMemory="1000" 
            timeToLiveSeconds="3600" 
            timeToIdleSeconds="3600"
            overflowToDisk="false" 
            eternal="false" />
     
        <cache name="monPackage.Resume"
            maxElementsInMemory="1000" 
            timeToLiveSeconds="3600" 
            timeToIdleSeconds="3600"
            overflowToDisk="false" 
            eternal="false" />
     
     
        <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="3600"
            timeToLiveSeconds="3600"
            overflowToDisk="false" />
     
    </ehcache>
    et le hbm.xml pour la classe Resume :
    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
     
    <hibernate-mapping >
    	<class name="monPackage.Resume" table="RESUME">
            <cache usage="read-write" />
     
    		<id name="id" column="ID" unsaved-value="null">
    			<generator class="native" />
    		</id>
     
    		<property name="codeEtablissement" column="CODEETAB" not-null="false" unique="true"/>
     
            <property name="note" column="NOTE" not-null="false" />
     
            <property name="nbAvis" column="NBRE_AVIS" not-null="false" />
     
    	</class>
    </hibernate-mapping>
    enfin la requete que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            requete.append("FROM Resume r WHERE r.codeEtablissement in (");
            requete.append(paramListeCodeEtab.toString());
            requete.append(')');
            Query query = this.getSession().createQuery(requete.toString());
            query.setCacheable(true);
            query.setCacheRegion("org.hibernate.cache.StandardQueryCache");
    mon application ne tourne pas sur un serveur car il fait patrie d'un composant qui peut être appelé soit sur un serveur soit en batche. Je fait mes tests avec un test untiaire qui appel deux fois de suite la fonction dont fait partie la requête ci-dessus.

    Voili voilou

    Ah si un truc que j'ai oublié, si je force EHCache à mettre son cache sur le disque, il met bien des données dans le fichier org.hibernate.cache.StandardQueryCache.data qu'il crée sur le disque dur. Pourtant le deuxième requête passe bien.

  9. #9
    Membre confirmé Avatar de nighthammer
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2005
    Messages : 122
    Par défaut
    Alors, j'ai réussi à trouver une personne qui s'y connaissais pas mal en interne, et elle m'a trouvé la raison de mon problème. En fait mon test unitaire était polué par le cache de session.

    En fait, dans la même session, je faisais l'insertion des données en base et l'appel à mes données. Du coup, mon cache de session me posait problème. En insérant les données àa la main et en faisant un appel à ces données, la cache de niveau deux a bien fonctionné. (je n'ai pas trop bien compris à cause de quel mécanisme ça ne marchait pas mais bon.)

    En tout cas, merci beaucoup fr1man pour tes réponses.

    Je repasse ce post en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] Comment tester que l'utilisateur a saisi un chiffre
    Par antezi dans le forum Free Pascal
    Réponses: 2
    Dernier message: 25/04/2013, 11h40
  2. Réponses: 5
    Dernier message: 05/08/2011, 01h15
  3. Réponses: 12
    Dernier message: 07/09/2010, 15h54
  4. Réponses: 1
    Dernier message: 29/12/2009, 09h02
  5. [XML]Comment tester que mon fichier XML est comme ceci?
    Par Devil666 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/06/2005, 14h41

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