4

Quelqu'un peut-il m'aider à résoudre cette question. J'utilise Infinispan comme cache de second niveau et Hibernate comme ORM. J'ai activé à la fois enityt et le cache de requête.Query Cache Hibernate entités de chargement

J'ai deux requêtes, par exemple Q1 est "Selet b de BokkEntity b où b.id < 5" et un autre comme Q2 est "sélectionner b de BokkEntity b où b.id < 7"
La première fois que je Je cours Q1 il charge 5 objets du magasin persistant dans le cache. l'exécution de la deuxième requête la première fois charge 7 objets dans le cache. Alors que les cinq premiers objets sont communs dans les deux requêtes. Et selon ma compréhension de la requête, Cache cache toujours l'ID, et si le cache de l'entité est dans la recherche, il est fait dans le cache pour les objets, référencés par les ID, dans le cache de requête.

Alors ma question est pourquoi les deux Q2 se charge tous les objets encore et ceux-ci dans le cache d'écraser l'entité pendant que je cours Q2 (après q1 en cours d'exécution) première fois.

J'ai vérifié que le cache de requête fonctionne correctement pour toute demande ultérieure. Par exemple, si je réexécute Q1 ou Q2, les données sont accessibles à partir du cache.

C'est urgent, j'apprécierai l'effort.

Merci

Meena

Répondre

1

Hibernate n'a aucun moyen de dire qui résulte d'une requête a déjà à moins qu'il a exécuté cette même requête avant exacte. Ainsi, c'est le comportement attendu.

par la mise en veille prolongée documentation:

Si vous avez des questions qui fonctionnent encore et, avec les mêmes paramètres, la mise en cache de requête fournit des gains de performance.

Notez la phrase: avec les mêmes paramètres.

Si vous demandez à hibernate de récupérer une entité par identifiant, il peut facilement rechercher son cache. Mais avec une requête qui n'a pas été exécutée auparavant, un certain nombre de choses peuvent avoir été insérées depuis la dernière exécution (elle invalide uniquement les serveurs, elle n'ajoute pas ou ne met pas à jour les caches de serveurs distants). De plus, avec les requêtes, hibernate est trop grand (une bonne chose) pour invalider ses caches de requêtes (à chaque fois qu'une mise à jour de base de données se produit, vous perdrez probablement tous les résultats de la requête en cache). Le type de logique qu'ils devraient mettre en œuvre pour s'assurer que vos 2 requêtes pourraient être fusionnées et divisées serait extrêmement compliqué et ne serait probablement pas possible sans une connaissance intime de la structure de votre base de données et de votre logique de programme.

+0

En outre, cela semble être un bon article sur les pièges de l'utilisation de la mise en cache des requêtes: http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ Citation de l'article: "La principale raison que le cache de requête n'est souvent pas utile, c'est que les résultats sont constamment invalidés par des modifications de table. " –