Frage

Ich bin mit JBoss 5.1.0 GA zusammen mit Hibernate und ich versuche nun den Cache der zweiten Ebene zu ermöglichen. Ich habe die folgenden Eigenschaften zu meiner Hibernate-Konfiguration hinzugefügt.

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />

Und ich habe Entitäten kommentiert, dass ich erwarte, dass selten mit folgenden Änderungen:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)

Dies basiert auf mein Verständnis der Dokumentation .

Die Anwendung setzt erfolgreich ohne unheimlich aussehenden Nachrichten (z WARN oder Fehlermeldungen im Log-Stream). Für eine kurze Zeit sehe ich das Caching arbeiten (I Hibernate Statistik bin mit dieser sehen), aber nach kurzer Zeit ich Stack-Traces des Formulars erhalten (auch wenn Sie sich als Single-User angemeldet ohne Fernzugriff auch immer):

  

"Transaktion versucht zu erstellen   neu MYCLASS. Es wurde bereits   da diese Transaktion erstellt   gestartet wird, durch ein anderes (möglicherweise remote)   Transaktion. Wir haben eine gleichzeitige   creation event "

Nach dem von einem riesigen Stack-Trace, die schließlich zu einer benannten Abfrage geht zurück, dass ich gemacht habe, die die folgende Form hat:

SELECT x FROM X WHERE x.deleted = false

Die benannte Abfrage hat keine zusätzliche Anmerkungen für das Caching.

Alle Ratschläge, wie man dieses Problem lösen würde sehr geschätzt werden.

War es hilfreich?

Lösung

Einige Fragen zuerst:

  1. Ist diese Ausnahme zu Ihrer Anwendung propagiert? Ich meine, Sie sind davon betroffen, oder Sie sind nur über die Meldung im Protokoll betroffen?
  2. Sind alle Ihre Einheiten mit Transactional Strategie kommentiert, oder nur einige von ihnen?
  3. Ist Ihre Abfrage abruft eifrig geholt Objekte einer anderen Klasse?

Ich würde sagen, dass das Beste, was Sie jetzt tun können, ist DEBUG (oder vielleicht sogar TRACE) Anmeldung für die Cache-Operationen zu aktivieren: log4j.logger.org.hibernate.cache=debug Diese Ihnen genau sagen wird, was Hibernate tut. I verdächtigen , dass Hibernate versucht, ein Objekt in den Cache zu stellen, und es wieder tun, wenn es das gleiche Objekt in der gleichen Sitzung sieht (vielleicht als Teil eines anderen Objekts Baum). Es gab einen Zeitstempel Problem für den Query Cache vor einiger Zeit, und das gleiche Problem könnte hier auftreten. Zum Beispiel:

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

Aber auch hier ist es ein bisschen schwer vorherzusagen, was die Lösung ist, ohne zu wissen, was das Problem sein würde. Und ich habe Angst, dass nur Protokoll des Hibernate kann Ihnen sagen, was das Problem wirklich ist.

PS:. Dies sollte als Kommentar gepostet werden, aber das war einfach zu lang für sie

Andere Tipps

Haben Sie CacheConcurrencyStrategy.NONSTRICT_READ_WRITE versucht? Ich lese viel Mal die docs und wissen nicht genau, was zu wählen, aber es scheint zu funktionieren für meine Projekte. Ich denke, die CacheConcurrencyStrategy.TRANSACTIONAL ist zu viel sicherer und die Cache-Leistung unter bestimmten Umständen vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top