Hi EEler,
ich habe in einem Projekt für Hibernate den Second Level Cache aktiviert. Als Implementierung verwende ich EHCache. Ich habe einen Objektgraphen, auf den im laufenden Betrieb nur lesend zugegriffen wird. Diesen Objektgraphen möchte ich komplett im 2nd Level Cache puffern, um die DB-Zugriffe zu minimieren.
Ich habe alle Entitäten und Collections auf Entitäten innerhalb dieses Objektgraphen für den Cache annotiert:
Wenn ich nun einfach per Session#get(id) eine Entität aus diesem Objektgraphen lade, dann funktioniert der Cache wie gewünscht: Daten werden per Select geladen und danach kommt das ReadOnlyCache.put. Wenn ich danach nochmal die gleiche Entität per Session#get(id) lade, dann kommt kein Select mehr, stattdessen wird die Entität aus dem Cache geholt. Soweit so gut.
Wenn ich nun aber per Criteria eine Abfrage baue, die genau eine Entität liefert, aber zusätzlich noch verschiedene Properties joint, dann wird die Entität (und alle gejointen Entitäten und Collections) zwar in den Cache gelegt, aber bei einem erneuten Aufruf nicht wieder aus dem Cache geholt, sondern wieder per DB-Select geladen.
Funktioniert der 2nd Level Cache nicht für HQL- bzw. Criteria-Abfragen? Oder muss man dafür explizit den Query Cache aktivieren? Ich hatte jetzt angenommen, dass es auch ohne Query Cache funktionieren müsste, solange das Statement genau eine Entität liefert und keine Liste von Entitäten? Oder liege ich da falsch?
TIA byto
ich habe in einem Projekt für Hibernate den Second Level Cache aktiviert. Als Implementierung verwende ich EHCache. Ich habe einen Objektgraphen, auf den im laufenden Betrieb nur lesend zugegriffen wird. Diesen Objektgraphen möchte ich komplett im 2nd Level Cache puffern, um die DB-Zugriffe zu minimieren.
Ich habe alle Entitäten und Collections auf Entitäten innerhalb dieses Objektgraphen für den Cache annotiert:
Code:
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
Wenn ich nun einfach per Session#get(id) eine Entität aus diesem Objektgraphen lade, dann funktioniert der Cache wie gewünscht: Daten werden per Select geladen und danach kommt das ReadOnlyCache.put. Wenn ich danach nochmal die gleiche Entität per Session#get(id) lade, dann kommt kein Select mehr, stattdessen wird die Entität aus dem Cache geholt. Soweit so gut.
Wenn ich nun aber per Criteria eine Abfrage baue, die genau eine Entität liefert, aber zusätzlich noch verschiedene Properties joint, dann wird die Entität (und alle gejointen Entitäten und Collections) zwar in den Cache gelegt, aber bei einem erneuten Aufruf nicht wieder aus dem Cache geholt, sondern wieder per DB-Select geladen.
Funktioniert der 2nd Level Cache nicht für HQL- bzw. Criteria-Abfragen? Oder muss man dafür explizit den Query Cache aktivieren? Ich hatte jetzt angenommen, dass es auch ohne Query Cache funktionieren müsste, solange das Statement genau eine Entität liefert und keine Liste von Entitäten? Oder liege ich da falsch?
TIA byto