2008-10-02 9 views
3

J'essaie de comprendre comment le cache de requêtes Hibernate fonctionne vraiment. Ce que je vois maintenant, c'est qu'Hibernate ne met pas automatiquement à jour son cache de second niveau lorsque j'insère de nouvelles entités dans la base de données (bien que j'utilise uniquement les appels Hibernate). La seule façon que j'ai trouvé pour le faire fonctionner était de nettoyer manuellement le cache après avoir inséré de nouvelles entités.invalidation automatique du cache de requêtes

Voici l'exemple le plus concret. J'ai une entité persistante appelée Container qui peut contenir plusieurs éléments. Je voulais avoir tous les éléments mis en cache:

 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
class Item 
{ 
    // rest of the code ... 
} 

class Container { 
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... } // rest of the code ... }

Le problème que je l'ai remarqué est que lorsque je:

1) lu quelques conteneurs de la DB en mémoire (en même temps que les éléments correspondants)

String hql = 
     "from Container c left join fetch c.items where c.type = 1"; 
    List<Item> list = hibernateTemplate.find(hql); 

2) insérer un nouveau point et pour un conteneur choisi

hibernateTemplate.save(item) 

3) répéter le sapin st étape
puis dans la 3ème étape je ne peux pas voir l'article que j'ai inséré dans la deuxième étape. Je vois que si je nettoyer le cache manuellement après l'insertion d'éléments nouveaux:

sessionFactory.evictCollection("Container.items", updatedContainerId) 

Mon intuition me dit que Hibernate doit faire une telle invalidation du cache automatiquement. Est-ce que quelqu'un l'a vu fonctionner? Est-ce que je fais quelque chose de mal ou est-ce que ce n'est pas supporté?

Merci d'avance pour la réponse. Messages d'accueil Tom

+0

Je viens de répondre à cela l'autre jour: http://stackoverflow.com/questions/4500221/hibernate-sqlquery-bypasses-hibernate-session-cache/10828200#10828200 –

Répondre

1

Hibernate stocke les données des requêtes en utilisant une clé composée de la requête (ou du nom de la requête) et de la valeur des paramètres spécifiés. Je suppose qu'il ne peut pas facilement savoir quel cache invalider lorsque vous modifiez des données.

Pour résoudre ce problème, vous devez simplement appeler SessionFactory.evictQueries.

6

Vous trouverez peut-être mon blog sur fonctionnement du cache de requête pour aider à comprendre ce que le cache de requêtes fait et pourquoi il ne pourrait pas travailler comme vous pensez cela fonctionne:

+0

mettre dans cette réponse au moins une explication minimale concernant la question du sujet? – Scadge

-1

Oui , l'invalidation automatique du cache de requêtes est absente pour les requêtes SQL natives. Pour les requêtes HQL, il supprime CLEARS ALL CACHES si l'une des tables participant à la requête a INSERT/UPDATE/DELETE pour n'importe quel objet.

Donc, vous pouvez essayer le projet Hibernate Dynamic SQL Cache, il vise à résoudre ce problème en mettant à jour automatiquement les caches de requêtes SQL sans invalidation.

P.S. "Bill le lézard" merci de comprendre :)