2017-01-24 1 views
3

Wir verwenden Hibernate 3.5.6 zusammen mit Hazelcast 3.6.1 als 2nd Level Cache. Wir haben das folgende Problem. Wir haben eine Hibernate-Entität mit einer nicht faulen Sammlung. Beim Hinzufügen von Elementen zur Sammlung in zwei aufeinanderfolgenden Sitzungen auf demselben Knoten wird die gesamte Sammlung immer von der Datenbank neu geladen. Ich hätte erwartet, dass der Cache der zweiten Ebene einfach aktualisiert werden könnte, wenn ein Element der Sammlung hinzugefügt wird, anstatt es vollständig aus dem Cache zu entfernen und jedes Mal neu zu laden, um einen weiteren Eintrag hinzuzufügen. Ist dies ein prinzipielles Problem des Hibernate-2nd-Level-Caches oder ist dies ein Konfigurationsproblem auf unserer Seite?Update 2nd Level Cache statt Invalidating

+0

Dies kann mit der Kapazität des Caches zusammenhängen. Hast du das überprüft? –

+0

... 0 0 LRU 5000 25 100 ...

+0

ich die Konfiguration entsprechend geändert, aber es hat nicht das Verhalten ändern –

Antwort

0

Ich denke, ich kann die Frage selbst beantworten. In der Tat wird Hibernate nicht die Sammlung aktualisieren, aber immer ungültig machen. Ich habe die folgende Erklärung hier gefunden: http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache:

Was sind die Caching-Semantik? Nun, der Schlüssel ist, dass Sammlungen niemals im Cache aktualisiert werden; Sie werden nur aus dem Cache ungültig gemacht und später möglicherweise erneut als Ergebnis eines anderen Datenbanklesevorgangs zwischengespeichert. Wenn eine Anwendung namens Group.addMember() aufgerufen wird, wird Hibernate die Mitgliedschaftsgruppe dieser Gruppe aus dem Cache entfernen. Wenn JBoss Cache die Cache-Implementierung der zweiten Ebene ist, wird diese Entfernung im Cluster verteilt. Die Sammlung wird auf allen Knoten im Cluster aus dem Cache entfernt.

Wenn die Anwendung später auf die Mitglieder dieser Gruppe zugreifen muss, wird eine andere Datenbank gelesen, und die aktuellen Primärschlüssel für die Mitglieder werden in den Cache gestellt.

0

Der Ruhezustand-Cache ist standardmäßig auf PK festgelegt. Wenn Sie also findAll() verwenden, wird der Ruhezustand-Cache nicht verwendet, wenn Sie eine findOne (id) ausführen.

Wenn Sie findAll() zwischenspeichern möchten, würde ich ehcache und @Cache annoations verwenden, seien Sie vorsichtig, welchen Schlüssel es für seinen Cache verwendet. Siehe http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html

+0

Das Problem, das wir haben, ist, dass wir ein Element hinzufügen möchten die Sammlung tion. Hibernate lädt immer die gesamte Sammlung, um ein Element hinzuzufügen. Das Problem ist jetzt, dass wenn die Sammlung nicht aus dem Cache der 2. Ebene geladen werden kann (was ich in unserem Fall nicht verstehe), wird immer die Datenbank abgefragt, um die gesamte Sammlung zu laden. –

+0

@JanSchaefer richtig, Sie müssen diesen Cache selbst übernehmen. Ich bin froh, dass ich mich als falsch erwiesen habe, aber ich habe genau das selbe Problem wie du oft durchgemacht. –

Verwandte Themen