2017-05-05 3 views
1

Ich habe eine entity A und es ist definiert als @Cacheable. Und ich habe Abfrage-Cache laden die entity A unter angegebenen Cache-Bereich sagen "regionA". Dies wird durch setHint und aktivierten Cache erreicht.Infinispan 2LC: Entity-Cache mit im Query-Cache angegebenen Regionen

Was die Einstellungen in wildfly, The regionA ist ohne eviction und expiration als 1 Tag konfiguriert, wo als die entity Cache wie unten Standard eviction und expiration let sagen hat.

 <local-cache name="entity"> 
      <transaction mode="NON_XA"/> 
      <eviction strategy="LRU" max-entries="10000"/> 
      <expiration max-idle="1000000"/> 
     </local-cache> 
     <local-cache name="local-query"> 
      <eviction strategy="LRU" max-entries="10000"/> 
      <expiration max-idle="100000"/> 
     </local-cache> 
     <local-cache name="regionA" statistics-enabled="true"> 
      <eviction strategy="NONE" max-entries="-1"/> 
      <expiration lifespan="86400000" max-idle="14400000"/> 
     </local-cache> 

Jetzt, wenn ich zum ersten Mal ausführen, gibt es keine Abfrage-Cache-Ergebnisse, daher SQL zum Abrufen der Entität ausgeführt wird. Und später scheint der 2. Lauf, 3rd aus dem Cache regionA und damit in Ordnung zu sein. Aber nach 18 Stunden habe ich versucht, dieselbe Abfrage auszuführen, und es sieht so aus, als ob die Abfrage erneut ausgeführt wird.

Aber ich nehme an, wenn der Abfrage-Cache als "1 Tag" Ablauf konfiguriert ist, warum läuft es wieder SQL? Ist der Cache entity zu diesem Zeitpunkt abgelaufen? Der Cache entity nimmt also keine Cache-Bereich-spezifischen Einstellungen? Wie Sie diese in der spezifischen Cache-Region gespeicherten Entitäten unterscheiden können, folgen Sie den regionsspezifischen Einstellungen.

Danke.

Antwort

3

Sie haben max-idle="14400000", was bedeutet, dass das zwischengespeicherte Ergebnis abläuft, wenn die Abfrage in den letzten 4 Stunden nicht ausgeführt wurde.

+0

Danke für das Finden. Gibt es eine Möglichkeit, die Entity anzugeben, die die Konfiguration von regionA Cache verwendet und sie in der angegebenen Cache-Region speichert? Weil jede Entität standardmäßig eine eigene Region erstellt. – ulab

+0

Sie müssen Hibernate 'org.hibernate.annotation.Cache' verwenden, um die Region zu definieren. Oder setze dies extern über die 'orm.xml'. –

+0

Danke ich habe es. Mit hibernate.cfg kann ich also ALLE Entitäten so konfigurieren, dass sie die angegebene Region oder EACH-Entity verwenden, um die angegebene Region zu verwenden. Es ist jedoch nicht möglich, nur die Entitäten anzugeben, auf die in einer Abfrage mit Cache-Region als regionA verwiesen wird. Recht? – ulab