2010-09-30 6 views
27

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é la seconde fois, il ne frappe pas la base de données et récupère simplement les résultats du cache.Comment désactiver la mise en cache d'hibernation

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é.

+1

Essayez-vous d'accomplir les deux lectures au sein de la même session? si c'est le cas, ce comportement est attendu du cache de premier niveau. Sans voir votre cas de test, il est difficile de vous donner une réponse exacte. – Sean

Répondre

18

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 cache de requêtes sont désactivées par défaut (et les requêtes ne sont pas mises en cache à moins que vous les explicitement cache). Le cache de premier niveau ne peut pas être désactivé.

J'ai essayé de désactiver par modification des propriétés (...)

Ce désactiverait le cache de second niveau et cache de requêtes, si ils ont été activés.

Mais cela n'a pas fonctionné.

Pour être honnête, « cela n'a pas fonctionné » est une description très pauvre du comportement actuel vs celui attendu. Fournissant plus de détails, (pseudo) code, les traces SQL aideraient probablement. Ceci étant dit, si la question concerne HQL, une requête HQL devrait certainement être placée dans la base de données lors de l'exécution suivante (sans cache de requête). Activez la journalisation SQL si nécessaire pour observer ceci.

Si la question porte sur Session#get() ou Session#load(), alors vous pouvez recharger l'état d'une entité à l'aide Session#refresh() ou appelez Session#clear() à la session tout à fait claire.

+0

Désolé, mais cela ne vous aide pas. –

0

Selon un gars de l'équipe de hibenrate:

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

Source: https: //forum.hibernate.org/viewtopic.php p = 2383408
Vous pouvez utiliser seesion.evict (votre objet) avant de retenter la même requête?.

6

Vous pouvez utiliser:

session.setCacheMode(CacheMode.IGNORE)

après votre:

déclaration session.createQuery("from Table").

Cela garantira qu'Hibernate n'interagit pas avec le cache de second niveau pour toute entité renvoyée par cette requête.

2

Si vous créez une nouvelle session (différente) dans votre test d'unité, elle n'utilisera pas le cache de l'ancien. Ou si vous appelez clair() sur ce premier (une autre option), etc.

+1

L'utilisation de clear() a sauvé le jour. Merci un million! –

8

Mise en veille prolongée a deux niveaux de cache,

  1. cache de session (cache de premier niveau) est cache par défaut et il n'y a pas de mécanisme désactiver.

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

    J'avais une exigence pour charger des données lourdes de DB, et j'ai utilisé session sans état en raison des caractéristiques 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 session stateless:

    StatelessSession statelessSession = sessionFactory.openStatelessSession(); 
    
+0

Est-ce que 'entityManager.clear()' ne nettoie pas le cache de premier niveau? – Derp

0

Après la première fois que vous interrogez le résultat, appelez Session.clear et la même requête frappera la base de données plutôt que cache de niveau 1

Questions connexes