6
votes

Hiberner JPA Caching

J'ai une table nommée master_info_tbl strong>. C'est une table de recherche:

Voici le code de la table: p> xxx pré>

J'ai une couche de service qui appelle la méthode
Service .FindbyCodeType ("Code1"); B>

Mode même, cette table est interrogée pour les autres types de code, par exemple Code2, code3 et ainsi de suite du Code10 B> qui obtient le résultat défini à partir du même tableau et est affiché dans la liste déroulante des pages JSP, car ces déchets sont dans 90% des pages que je pense à les mettre en cache globalement .
Toutes idées Comment y parvenir?

FYI: J'utilise JPA et Hiberner avec Struts2 et Spring. La base de données utilisée est db2 udb8.2 b> p>


@pascal b>

Merci beaucoup pour toutes vos réponses. Cela m'a aidé beaucoup. J'ai mis en œuvre tout ce que je suis censé mettre en œuvre (je pense). Je ne sais toujours pas si la deuxième mise en cache de niveau fonctionne ou non. Depuis que je ne suis pas capable de voir quoi que ce soit dans la journalisation du fichier de journalisation du log4j dans le cache et que rien ne s'affiche dans la console. Afin de montrer que la mise en œuvre du cache de deuxième niveau est de travailler, j'ai besoin d'avoir une sorte de preuve et doit le montrer à mon gestionnaire. Je suis un peu coincé. aide s'il vous plaît! b> B> Je sais que je suis très proche de la finition mais juste .... Voici mon code (si vous pensez que quelque chose manque quelque chose qui manque ou Quelque chose ne devrait pas être là s'il vous plaît faites-le-moi savoir):

b> p> xxx pré>

persistance.xml: b> p >

<ehcache>
   <diskStore path="java.io.tmpdir"/>
   <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="6000"
        timeToLiveSeconds="12000"
        overflowToDisk="true"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"
        />

</ehcache>


0 commentaires

4 Réponses :


0
votes

Jetez un coup d'oeil à hibernate Cache de requête fonctionnalité.

Vous pouvez également utiliser une solution de mise en cache autonome léger, comme oscache . Cela vous donne un contrôle total sur quoi, quand et comment est mis en cache, mais vous devrez également penser quand rafraîchir le cache.


2 commentaires

J'ai vérifié le lien que vous avez fourni mais cela ne va pas m'aider parce que j'utilise la même méthode et que je demande à nouveau la même méthode avec différents arguments (code1, code2, code3, etc.) afin que les données précédentes soient. rougir automatiquement depuis sa même requête uniquement avec différents paramètres.


J'ai une autre solution comme suit: si (instance de requêteof org.hibernate.ejb.queryimpl) {enregistreur .info ("Oui La requête est de l'instance org.hibernate.ejb.QueryImpl So Alreedy définit le Cacheable True"); ((org.hibernate.ejb.Queryimpl) requête) .GethibernateQuery () .Setcacheable (vrai); } Tu crois que ça pourrait marcher ...



13
votes

(...) Depuis que ces chutes sont dans 90% des pages que je pense à les mettre en cache globalement.

Utilisation du cache de requête serait très approprié pour ce cas d'utilisation. Ainsi, activez le cache de second niveau , cache l'entité codevalue (voir 2.2.8. Entités de mise en cache ) et mettez la requête derrière FindbyCodeType dans le cache de requête . Pour ce faire, utilisez: xxx

et pour clarifier, la combinaison de la requête et les valeurs fournies en tant que paramètres à cette requête est utilisée comme clé et la La valeur est la liste des identificateurs pour cette requête . Schématiquement, quelque chose comme ça: xxx

appelant ainsi que votre méthode avec différents arguments ne "affleurera pas les données précédentes", l'argument fait partie de la clé (ou du cache de requête "T Travail)

  • hibernate: vraiment comprendre les caches de second niveau et de requête

  • 5 commentaires

    Comme je l'ai mentionné, j'utilise JPA avec hibernate et pour une raison quelconque lorsque j'essaie de définir EM.SeCacheable (vrai); Je ne suis pas capable de le faire. C'est le code d'entitémanger: importer javax.persistence.entityManager; @PersistieCecontext public Void SetentityManager (EntityManager em) {this.em = em; } Y a-t-il un fichier JAR que je manque?


    J'ai une autre solution comme suit: si (instance de requêteof org.hibernate.ejb.queryimpl) {enregistreur .info ("Oui La requête est de l'instance org.hibernate.ejb.QueryImpl So Alreedy définit le Cacheable True"); ((org.hibernate.ejb.Queryimpl) requête) .GethibernateQuery () .Setcacheable (vrai); } Tu crois que ça pourrait marcher ...


    @Pascal merci beaucoup pour la mise à jour. J'ai mis en œuvre le cache de 2e niveau. Maintenant, comment puis-je savoir que la mise en cache fonctionne correctement. Je voulais dire que je veux juste m'assurer que l'objet que je marquais aussi cachéable est là dans le cache quelque part?


    @Sameer Configure Hibernate sur Log TOUTES L'activité de cache de deuxième niveau . Voir Cette réponse


    @Pascal Veuillez regarder dans la nouvelle réponse que j'ai posté et si vous avez une suggestion à ce sujet.



    -2
    votes

    Vous ne voyez rien dans le journal car le cache ne vous informe pas de Hits / Misses par défaut. Utiliser statistiques = "true" sur votre defaultCache élément pour inclure des informations à ce sujet.

    Hibernate enregistre tristement les instructions SQL à la console même si le coup provient du cache.


    1 commentaires

    "Hibernate enregistre tristement les instructions SQL à la console, même si le coup provient du cache." Pas vrai.



    6
    votes

    Hibernate enregistre tristement les instructions SQL à la console même si le coup provient du cache.

    faux, hibernate ne connecte pas les instructions SQL si le cache a été utilisé, confirmé avec la configuration suivante:

    persistance.xml: xxx

    Classe d'entité: xxx

    journalisation: xxx


    0 commentaires