2011-01-06 7 views
0

Ich benutze JBoss 5.1.0 GA zusammen mit Hibernate und ich versuche nun den Second Level Cache zu aktivieren. Ich habe die folgenden Eigenschaften zu meiner Hibernate-Konfiguration hinzugefügt.Concurrent Creation Event

<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 mit dem folgenden selten zu ändern erwarten:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL) 

Dies basiert auf meinem Verständnis der documentation.

Die Anwendung wird erfolgreich ohne gruselig aussehende Nachrichten (z. B. WARN oder ERROR Nachrichten im Protokolldatenstrom) bereitgestellt. Für eine kurze Zeit sehe ich Caching funktioniert (ich benutze Hibernate-Statistiken, um dies zu sehen), aber nach kurzer Zeit bekomme ich Stack-Traces des Formulars (auch wenn als einzelner Benutzer ohne Remote-Zugriff wie auch immer angemeldet):

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

Gefolgt von einer gigantischen Stack-Spur, die schließlich zu einem Nam zurückführt ed-Abfrage, die ich gemacht habe, die die folgende Form hat:

SELECT x FROM X WHERE x.deleted = false 

Die benannte Abfrage hat keine zusätzlichen Anmerkungen zum Zwischenspeichern.

Jeder Rat, wie man dieses Problem löst, würde sehr geschätzt werden. Einige Fragen

+1

Kein sicher, dass es helfen wird, aber ich würde versuchen, mit Sperren und Isolationseinstellungen des Cache zu spielen. – Stas

+0

Das half - wechselte zu pessimistic-entity statt mvcc-entity und alles ist wieder gut. –

Antwort

1

zuerst:

  1. Ist diese Ausnahme zu Ihrer Anwendung propagiert? Ich meine, bist du davon betroffen, oder du bist nur besorgt über die Nachricht im Log?
  2. Sind alle Ihre Entitäten mit einer Transaktionsstrategie oder nur einigen davon gekennzeichnet?
  3. Ruft Ihre Abfrage eifrig abgerufene Objekte einer anderen Klasse ab?

Ich würde sagen, dass das Beste, was Sie jetzt tun können, ist DEBUG (oder vielleicht sogar TRACE) Protokollierung für den Cache-Operationen zu aktivieren: log4j.logger.org.hibernate.cache=debug Dies wird Ihnen genau sagen, was Hibernate tut. I verdächtigen, dass Hibernate versucht, ein Objekt in den Cache zu versetzen und es erneut zu tun, sobald es das gleiche Objekt während derselben Sitzung (möglicherweise als Teil der Struktur eines anderen Objekts) sieht. Es gab vor einiger Zeit ein Zeitstempelproblem für den Abfragecache, und hier könnte das gleiche Problem 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 Hibernate's Protokoll Ihnen sagen kann, was das Problem wirklich ist.

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

+0

Danke für die Kommentare. Als Antwort auf deine Fragen. 1) Dies wird an die Anwendung weitergegeben und verursacht einige Probleme. 2) Alle cachefähigen Entitäten werden auf die gleiche Weise mit Anmerkungen versehen, aber es ist nur ein kleiner Teil der Entitäten, die wie diese kommentiert werden. 3) Es gibt einige @ ManyToOne-Beziehungen in der Klasse, die andere zwischengespeicherte Objekte einbeziehen. Ich stimme mit Ihrem Verdacht überein, dass dies das Problem verursachen könnte, damit ich die von Ihnen vorgeschlagenen Protokollierungsänderungen vornehmen und sehen kann, was passiert. Vielen Dank! –

+0

Ich änderte die Cache-Konfiguration, um pessimistic-entity anstelle von mvcc-entity zu verwenden, und die Fehlermeldung verschwand. Messungen zeigen, dass Caching eine Verbesserung ist, also werde ich es im Moment so lassen, wie es ist. Ich akzeptiere diese Antwort, da der Hinweis auf das Zwischenspeichern des Zwischenspeicherns im Debugging mich in die richtige Richtung wies. –

0

Haben Sie versucht, CacheConcurrencyStrategy.NONSTRICT_READ_WRITE?Ich lese die Dokumente oft und weiß nicht genau, was ich wählen soll, aber scheint gut für meine Projekte zu funktionieren. Ich denke, der CacheConcurrencyStrategy.TRANSACTIONAL ist zu sicher und vermeidet die Cache-Performance unter bestimmten Umständen.

+0

CacheConcurrencyStrategy.NONSTRICT_READ_WRITE scheint für den JBoss-Cache nicht unterstützt zu werden (zumindest gemäß dieser Dokumentation - http: //docs.jboss). org/hibernate/core/3.3/Referenz/html/performance.html # Performance-Cache). Ich kann READ-ONLY nicht verwenden, da die Wahrscheinlichkeit gering ist, dass die Entitäten geändert werden. –