Arbeitsbeispiel für Hibernate 3.6.2 Second Level Caching mit JPA2?

8

Der Titel sagt es offensichtlich: Ich kann den Cache der zweiten Ebene nicht für JPA2 / Hibernate 3.6.3 machen.

Ich habe schon so manch einen Hack versucht, damit es funktioniert. Aber es gelingt mir nur, dass der Abfrage-Cache funktioniert. Obwohl Hibernate die Caches (Name der Instanz) erstellt, werden sie ignoriert. Sogar Fehler werden nicht registriert. Vielleicht ist es eine Versionsinkompatibilität. Ich habe einige andere ohne Ergebnis ausprobiert. Und ich fühle mich der Aufgabe nicht mehr gewachsen, alle Permutationen auszuprobieren. :-P

Ich stelle die Frage hier, da einige Leute anscheinend funktionieren (deren Beispiele ich auch versucht habe). Vielleicht können sie den offensichtlichen Fehler erkennen, den ich mache.

Vielen Dank im Voraus für jeden, der mir hilft! : -)

persistence.xml

%Vor%

pom.xml

%Vor%

JMX-Konfiguration

So kann ich die Verwendung der Caches überprüfen. Die Caches werden erstellt (einer für jede Entität) und die beiden Abfragecaches sind ebenfalls vorhanden. Letztere füllen sich ziemlich schnell. Aber keines der Caches zeigt irgendwelche Verfehlungen oder Treffer. Nicht einmal die Abfrage wird zwischengespeichert.

%Vor%

Die Entitätscaches werden ignoriert. Sie sollten mindestens die Entitäten enthalten, die in der Datenbank gespeichert sind. Oder mit Abfragen abgerufen werden. Nichts bewegt sich dort.

Beispiel-Java-Code

%Vor%

Die Zusammenführung funktioniert - weil Daten in der Datenbank sind. Und der Fund funktioniert, weil ich Objekte mit generierten IDs erhalte.

Die abgefragten Entitäten werden in der Datenbank indiziert.

WHODUNNIT?

    
Jan Goyvaerts 08.06.2011, 16:54
quelle

2 Antworten

4

Den Schuldigen gefunden - obwohl es ziemlich kontraintuitiv ist:

Abgefragte Entitäten werden erst dann in den Cache der zweiten Ebene eingefügt, wenn Sie den Sitzungs- / Entitätsmanager schließen. Selbst wenn Sie mit den gleichen Objekten requery, wird immer noch kein Caching passieren.

Ich habe einen langen Batch-Prozess, in dem viele Referenzobjekte erstellt und wiederverwendet werden. Wenn ich die ganze Zeit den gleichen Entity Manager behalte, sehe ich das Ende des Prozesses nicht. Wenn ich den Entity Manager in jedem Zyklus neu erstelle, fliegt die Anwendung.

Ich dachte, es gäbe so etwas wie einen Cache der ersten Ebene - den Persistenzkontext?

    
Jan Goyvaerts 16.06.2011, 17:12
quelle
4

Einer meiner Projekte verwendet ehcache + hibernate + jpa2. Ich sage dir meine Konfiguration. Hoffe es hilft dir.

Framework-Versionen (maven-Abhängigkeit):

%Vor%

Die beiden Hibernate-Versionen werden getestet, aber ich verwende den Ruhezustand jpa2 api nicht.

persistence.xml:

%Vor%

ehcache.xml:

%Vor%

Schließlich sollten Sie Ihre cachefähige Entitätsklasse mit Anmerkungen versehen . Hier ist ein Beispiel:

%Vor%

Diese Konfiguration funktioniert für mich, ich hoffe, es war nützlich.

    
lepike 09.06.2011 19:58
quelle