2010-09-30 17 views
27

Ich versuche, eine Unit Test-Klasse zu schreiben, die dieselbe Abfrage verwenden muss, um die Ergebnisse aus der Datenbank zweimal in derselben Testmethode abrufen. Da der Hibernate-Cache jedoch zum zweiten Mal aktiviert wird, trifft er nicht wirklich auf die Datenbank und ruft die Ergebnisse einfach aus dem Cache ab.So deaktivieren Sie den Ruhezustand Caching

Kann jemand bitte beantworten, wie man Zwischenspeicherung in persistence.xml sperrt.

Ich habe versucht, durch Ändern der Eigenschaften hibernate.cache.use.query_cache = false und hibernate.cache.use_second_level_cache = false deaktivieren.

Aber es hat nicht funktioniert.

+1

Versuchen Sie, beide Lesevorgänge innerhalb derselben Sitzung durchzuführen? Wenn dies der Fall ist, wird dieses Verhalten vom Cache der ersten Ebene erwartet. Ohne Ihren Testfall zu sehen, ist es schwierig, Ihnen eine genaue Antwort zu geben. – Sean

Antwort

18

Kann jemand bitte beantworten, wie man Zwischenspeicherung in persistence.xml abstellt.

Der Second-Level-Cache und Abfrage-Cache werden standardmäßig (und Abfragen werden nicht zwischengespeichert sie, es sei denn Sie explizit Cache) deaktiviert. Der Cache der ersten Ebene kann nicht deaktiviert werden.

Ich habe versucht, durch Ändern von Eigenschaften (...)

Dies würde deaktivieren Sie den Second-Level-Cache und Abfrage-Cache, wenn sie aktiviert wurden zu deaktivieren.

Aber es hat nicht funktioniert.

Um ehrlich zu sein, „es nicht funktioniert“ ist eine sehr schlechte Beschreibung des aktuellen Verhalten gegen die erwartete ein. Die Bereitstellung von mehr Details, (Pseudo-) Code, SQL-Traces würde wahrscheinlich helfen.

Das heißt, wenn die Frage über HQL ist, sollte eine HQL-Abfrage definitiv die Datenbank bei der anschließenden Ausführung treffen (ohne Abfragecache). Aktivieren Sie ggf. die SQL-Protokollierung, um dies zu beobachten.

Wenn die Frage nach Session#get() oder Session#load(), dann könnte man den Zustand eines Unternehmens neu zu laden Session#refresh() oder rufen Sie Session#clear() vollständig klar die Sitzung.

+0

Entschuldigung, aber das ist nicht hilfreich. –

0

Nach einem Mann aus dem hibenrate Team:

Der Second-Level-Cache nichts tun mit der ersten Ebene hat (Session oder Persistenzkontext) Cache. Der Persistenzkontext/Sitzungscache ist aus verschiedenen Gründen obligatorisch. In Tatsache, nicht zu verstehen, diese entscheidende Teil und ignoriert es in der Anwendung Architektur ist ein Rezept für eine Katastrophe. Hier gibt es keine schnelle Lösung, Studie einige Dokumentation.

Quelle: https: //forum.hibernate.org/viewtopic.php p = 2.383.408
Sie seesion.evict verwenden könnten (das Objekt), bevor die gleiche Abfrage erneut versuchen?.

6

können Sie verwenden:

session.setCacheMode(CacheMode.IGNORE)

nach dem:

session.createQuery("from Table") Aussage.

Dadurch wird sichergestellt, dass Hibernate nicht mit dem Second-Level-Cache für Entitäten interagiert, die von dieser Abfrage zurückgegeben werden.

2

Wenn Sie eine neue (andere) Sitzung in Ihrem Komponententest erstellen, wird "nicht" der alte Cache verwendet. Oder wenn Sie klar nennen() auf es zuerst (eine andere Option) usw.

+1

Die Verwendung von clear() hat den Tag gerettet. Tausend Dank! –

8

Hibernate hat zwei Ebenen von Cache,

  1. Session-Cache (Cache erster Ebene) ist Standard-Cache und es gibt keinen Mechanismus Etwas deaktivieren.

  2. SessionFactory (zweite Ebene) Ebene Cache: Wir müssen dies in Hibernate-cfg-Datei von Einstellung cache_provider konfigurieren.

    Ich hatte eine Anforderung, schwere Daten von DB zu laden, und ich verwendete statuslose Sitzung wegen der folgenden Funktionen.

    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. 
    

    Syntax Stateless Sitzung zu erstellen:

    StatelessSession statelessSession = sessionFactory.openStatelessSession(); 
    
+0

Reinigt 'entityManager.clear()' nicht den so genannten First-Level-Cache? – Derp

0

Nach dem ersten Mal, wenn Sie das Ergebnis abzufragen, ruft session.clear und dann die gleiche Abfrage wird die Datenbank eher als Level 1-Cache Hit

Verwandte Themen