web-dev-qa-db-fra.com

Comment désactiver la mise en cache en veille prolongée

J'essaie d'écrire une classe de test unitaire qui devra utiliser la même requête pour extraire les résultats de la base de données deux fois dans la même méthode de test. Mais comme le cache Hibernate est activé pour la deuxième fois, il ne frappe pas la base de données et ne fait que récupérer les résultats à partir du cache.

Quelqu'un peut-il répondre s'il vous plaît comment désactiver la mise en cache dans persistence.xml.

J'ai essayé de désactiver en changeant les propriétés hibernate.cache.use.query_cache = false et hibernate.cache.use_second_level_cache = false.

Mais cela n'a pas fonctionné.

27
Srinivas

Quelqu'un peut-il répondre s'il vous plaît comment désactiver la mise en cache dans persistence.xml.

Le cache de second niveau et le cache de requête sont désactivés par défaut (et les requêtes ne sont pas mises en cache à moins que explicitement les cache). Le cache de premier niveau ne peut pas être désactivé. 

J'ai essayé de désactiver en changeant les propriétés (...)

Cela désactiverait le cache de second niveau et le cache de requête, si ils étaient activés. 

Mais cela n'a pas fonctionné.

Pour être honnête, "cela n'a pas fonctionné" est une très mauvaise description du comportement actuel par rapport au comportement attendu. En fournissant plus de détails, du code (pseudo), des traces SQL seraient probablement utiles.

Cela étant dit, si la question concerne HQL, une requête HQL doit absolument atteindre la base de données lors de son exécution ultérieure (sans cache de requête). Activez la journalisation SQL si nécessaire pour observer ceci.

Si la question concerne Session#get() ou Session#load(), vous pouvez alors recharger l'état d'une entité à l'aide de Session#refresh() ou appeler Session#clear() pour vider complètement la session.

19
Pascal Thivent

Hibernate a deux niveaux de cache, 

  1. Le cache de session (cache de premier niveau) est le cache par défaut et il n’existe aucun mécanisme pour le désactiver.

  2. Cache de niveau SessionFactory (deuxième niveau): Nous devons le configurer dans le fichier Hibernate cfg avec définition de cache_provider.

    J'avais l'obligation de charger des données lourdes à partir de la base de données et j'ai utilisé stateless session en raison des fonctionnalités suivantes.

     a. Stateless session does not support session cache and never interact with 
        second level cache.
     b. Stateless session does not support automatic dirty check.
     c. Stateless session does not support cascading to associated entities.
    

    Syntaxe pour créer une session sans état:

    StatelessSession statelessSession = sessionFactory.openStatelessSession();
    
9
Tony
4
Ray Hulha

Si vous créez une nouvelle session (différente) dans votre test unitaire, il n'utilisera pas le cache de l'ancien. Ou si vous appelez clear () en premier (une autre option), etc.

2
rogerdpack

Selon un gars de l'équipe d'hibenrate:

Le cache de second niveau n'a rien à voir faire avec le cache de premier niveau (contexte de session ou persistence). Le le cache de contexte/session de persistance est obligatoire pour diverses raisons. Dans fait, ne comprenant pas ce point crucial partie et en ignorant dans l'application l'architecture est une recette pour le désastre . Il n’ya pas de solution rapide ici, étudiez de la documentation.

Source: https: //forum.hibernate.org/viewtopic.php? P = 2383408
Vous pouvez utiliser seeSion.evict (votre objet) avant de réessayer la même requête.

0
frezzeraa

Après la première fois que vous interrogez le résultat, appelez session.clear puis la même requête s’appliquera à la base de données plutôt qu’au cache de niveau 1

0
user2462377