2014-06-21 5 views
2

Je voudrais clarifier certains points concernant le cache de niveau secondaire d'Hibernate. Le point à clarifier est, les requêtes HQL vont toujours frapper la base de données (au moins pour obtenir des identifiants).La requête HQL utilisera-t-elle le cache de second niveau Hibernate?

Tenez compte que nous avons des entités

class Customer { 

    long id; // Primary key 

    String name; 

    set <Address> addressList; // One to many relationship 

} 

class Address{ 

    long id; // Primary key 

    String houseName; 

} 

La table de base de données pour l'adresse a une référence clé étrangère à la (id) client pour soutenir un à plusieurs. Comme condition préalable, j'ai activé le cache de niveau 2 pour Hibernate comme EHcache. Seules l'entité et les associations sont configurées pour être mises en cache. La mise en cache des requêtes n'est pas activée.

Je sais que si j'utilise session.get() ou session.load() plus d'une fois, seul le premier appel lancera une requête vers les bases de données et les suivantes prendront les données du cache de niveau 2.

Mes questions sont

1) Est-ce HQL tirer profit du cache de second niveau. Dans une session, j'ai exécuté un HQL pour obtenir l'objet en utilisant la clé primaire (id), "à partir du client c où c.id =?") .setParameter (1, 1005).

Si j'ai exécuté la même HQL dans une session différente, l'objet Client sera-t-il pris dans le cache de niveau 2 ou il réapparaîtra dans la base de données.

2) Considérons un autre HQL exécuté from Customer as c left join fetch c.addressList pour sélectionner le client et l'adresse associée.

Si j'ai exécuté la même HQL dans une session différente, l'adresse associée sera-t-elle extraite du cache de niveau 2 ou sera-t-elle réappliquée à la base de données?

+0

Oui, HQL utilise le cache de second niveau, mais uniquement si vous définissez 'hibernate.query_cache' sur true et utilisez' setCacheable (true) 'sur la requête. –

Répondre

3

Étant donné que vous n'avez pas activé le cache de requêtes, aucune requête d'entité n'atteindra le cache de deuxième niveau. Par conséquent, à la fois les requêtes et exécuter contre la base de données.

Vous pouvez activer le cache de requête si vous souhaitez que ces requêtes utilisent le cache de second niveau à la place. Découvrez this article pour en savoir plus sur ce sujet.

+0

Merci @VlanMihalcea. Pour la question 1, je crois que le hibernate lancera la requête et obtiendra l'identifiant de toutes les lignes de table qui correspondent aux critères de recherche. Ensuite, il va charger l'objet en utilisant l'identifiant. L'objet peut être chargé à partir du niveau 2 ou à partir de la base de données selon la disponibilité. N'est pas étrange que je recherche seulement par ID, mais il faut quand même aller à la DB pour récupérer le même identifiant. –

+1

La recherche par id est un moyen de surcharger le mécanisme de récupération par défaut afin que vous puissiez déclarer explicitement un nouveau plan de récupération, et une requête peut également déclencher un flush avant de l'exécuter, c'est pourquoi il ignore tout simplement l'Entité du cache de 1er ou 2ème niveau. –

+0

S'il vous plaît trouver le fil similaire [link] (http://stackoverflow.com/questions/8989584/does-hql-query-always-hit-database-and-get-results) –

Questions connexes