2017-03-02 3 views
0

est-il possible de manully ajouter des clés à la carte de cache de requête Hibernate?Est-il possible d'ajouter manuellement des valeurs à la carte de cache de requêtes Hibernate?

S'il vous plaît voir mon raisonnement ci-dessous:

J'ai une requête comme suit:

from UserTable as u where u.username="Dan" and password="123456" 

Et la requête de résultat retourne un utilisateur avec l'identifiant de 3.

La première requête est seulement s'exécute une fois et est chargé dans le cache de requête.

Maintenant, alors que le premier résultat est mis en cache, je lance la requête suivante

from UserTable as u where u.id=3 

qui retournera le même utilisateur, mais comme je l'ai appris de divers site, like so, les requêtes seront traitées comme requêtes différentes entièrement par le cache (s'il vous plaît corrigez-moi si je me trompe bien sûr).

Existe-t-il un moyen de dire à Hibernate que les deux requêtes retournent les mêmes données? Cela permettra d'éviter à Hibernate de toucher la base de données la deuxième fois.

Une solution théorique que je peux penser est, après avoir émis la première requête, injecter la deuxième requête avec la première valeur de requête dans le cache, mais je ne suis pas sûr que ce soit possible.

Répondre

2

Y at-il un moyen de dire à Hibernate que les deux requêtes retournent les mêmes données? N °

Cela éviterait à Hibernate d'atteindre la base de données une deuxième fois. Cela ne devrait pas être un gros problème. La mise en cache des requêtes est destinée à être utilisée pour les requêtes qui sont souvent exécutées, donc une exécution supplémentaire ne devrait pas faire une grande différence.

Une solution théorique que je peux penser est, après avoir émis la première requête, injecter la deuxième requête avec la première valeur de requête à la mémoire cache, mais je ne suis pas sûr que ce soit possible. Théoriquement, c'est possible, mais il serait très complexe de l'implémenter manuellement (format d'entrée de cache, cache d'horodatage, synchronisation correcte avec d'autres sessions concurrentes, etc.).

La solution à votre exemple spécifique est d'activer la mise en cache de second niveau pour l'entité UserTable et de charger l'utilisateur avec session.load(UserTable.class, id) au lieu d'exécuter la deuxième requête. De cette façon, l'utilisateur sera récupéré du cache L2 car il a été chargé dans la première requête.

Important: Si vous avez beaucoup de dossiers d'entité UserTable, ni aucun de vos requêtes, ni entité UserTable doit être mis en cache. Jetez un oeil à ce blog pour un aperçu et les meilleures pratiques sur la mise en cache L2.