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 :

[Hibernate][ehcache][criteria]Requête ignore le cache


Sujet :

Hibernate Java

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 858
    Points
    1 858
    Par défaut [Hibernate][ehcache][criteria]Requête ignore le cache
    Bonjour,

    J'ai une application WEB qui utilise Hibernate. J'essaye d'y ajouter la gestion du cache de second niveau avec ehcache pour améliorer les performances. J'ai pu le configurer correctement pour un bean mais une requête batie avec l'API criteria ignore ce cache.

    Voici le code :

    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
    	Criteria crit = getSession().createCriteria(Demande.class);
    	// tri
    	crit.addOrder(Order.desc("demDatch"));
     
    	// jointure pour filtre
    	crit.createAlias("systeme", "sys")
    		.createAlias("sys.profils", "pro")
    		.createAlias("pro.roles", "rol");
     
    /* ... Construction de la requête, coupée ici */
     
    	// clause DISTINCT
    	crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
     
    	crit.setCacheable(true);
    	// J'ai également essayé avec d'autres régions de cache, ou sans cette ligne.
    	crit.setCacheRegion("org.hibernate.cache.StandardQueryCache");
    	List listDemande = null;
    	try{
    		listDemande = crit.list();
    	}
    		catch(Exception e)
    		{
    // ...
    Voici également le 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <ehcache>
     
     
        <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            />
     
        <!-- CACHES POUR LES OBJETS -->
     
        <!-- cache pour les demandes -->
        <cache
        	name="com.alikegroup.gestapp.backend.model.Demande"
        	maxElementsInMemory="500"
        	eternal="false"
    	    timeToIdleSeconds="300"
    	    timeToLiveSeconds="600"
    	    overflowToDisk="true"
    	/>
    	<!-- caches pour les collections des demandes (propriétés Set demandes et Set demandeRevisionPrecedentes; )-->
    	<cache
        	name="com.alikegroup.gestapp.backend.model.Demande.demandes"
        	maxElementsInMemory="500"
        	eternal="false"
        	timeToIdleSeconds="300"
        	timeToLiveSeconds="600"
        	overflowToDisk="true"
    	/>
    	<cache
        	name="com.alikegroup.gestapp.backend.model.Demande.demandeRevisionPrecedentes"
        	maxElementsInMemory="500"
        	eternal="false"
        	timeToIdleSeconds="300"
        	timeToLiveSeconds="600"
        	overflowToDisk="true"
    	/>
     
        <!-- CACHES POUR LES REQUETES -->
     
        <cache
    		name="net.sf.hibernate.cache.StandardQueryCache"
    		maxElementsInMemory="5"
    		eternal="false"
    		timeToLiveSeconds="120"
    		overflowToDisk="true"
    	/>
     
    	<!-- Ce cache mémorise les dates et heures de mise à jour des différentes tables.
        	Son timeout doit être plus élevé que celui de n'importe quel cache de requête.
        	Ici, conformément aux recommendations, il est configuré pour ne jamais expirer. -->
    	<cache
    		name="org.hibernate.cache.UpdateTimestampsCache"
            maxElementsInMemory="10000"
            eternal="true"
            overflowToDisk="true"
    	/>
     
    	<cache
    		name="demandeList"
    		maxElementsInMemory="15"
    		eternal="false"
    		timeToLiveSeconds="300"
    		overflowToDisk="true"
    	/>
    </ehcache>
    Par ailleurs, la région de cache demandeList n'apparaît pas dans la liste renvoyée par getSessionFactory().getStatistics().getSecondLevelCacheRegionNames()

    Il n'y a aucun message d'erreur. Simplement, l'application ignore complétement le cache.

  2. #2
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Essaie d'afficher l'initialisation de la SessionFactory... les caractéristiques d'ehcache sont précisée normalement.

    Sinon, pour Criteria, tu peux l'affecter à un cache précis selon la doc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Criteria 	setCacheable(boolean cacheable)
              Enable caching of this query result set
     Criteria 	setCacheMode(CacheMode cacheMode)
              Override the cache mode
     Criteria 	setCacheRegion(String cacheRegion)
              Set the name of the cache region.

    Mais ca tu l'as déjà fait en fait

    Enfin petit rappel pour déclarer ehCache à Hibernate :
    1- fichier ehcache.xml à la racine du classpath
    2- dans config.hbm.xml (ou fichier de propriete ou en programmtion) : mettre ces propriétés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    hibernate.cache.use_second_level_cache = true
    hibernate.cache.provider_class = org.hibernate.cache.EhCacheProvider
    hibernate.cache.use_query_cache = true
    3- dans le fichier de mapping : ajouter les stratégies de cache.

Discussions similaires

  1. JPA + Hibernate + ehCache : Mise en cache redondant ?!..
    Par zanteskuken dans le forum Hibernate
    Réponses: 0
    Dernier message: 10/01/2012, 21h31
  2. Requête Hibernate avec criteria en jointure
    Par Zodoh dans le forum Hibernate
    Réponses: 0
    Dernier message: 08/10/2010, 11h56
  3. [Hibernate] Faire une requête avec relation NN
    Par n@n¤u dans le forum Hibernate
    Réponses: 20
    Dernier message: 25/07/2006, 11h39
  4. [Hibernate]Pb de requête
    Par parasol007 dans le forum Hibernate
    Réponses: 1
    Dernier message: 17/07/2006, 17h01
  5. [hibernate] Ma sous-requête ne passe pas
    Par n@n¤u dans le forum Hibernate
    Réponses: 11
    Dernier message: 11/07/2006, 11h07

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