2015-07-23 31 views
12

JPA2 ile Spring Boot 1.2.5'i varlıklara açıklama eklemek için kullanıyorum (ve JPA uygulamasının altında yatan hazırda bekletme).Spring Boot + JPA2 + Hazırda Bekletme - ikinci düzey önbelleği etkinleştir

Ben kişiler @javax.persistence.Cacheable

ile açıklamalı edildi yüzden de application.properties aşağıdaki eklendi, bu kurulumda ikinci düzey önbellek kullanmak istedi

: önyükleme hazırda sırasında

spring.jpa.properties.hibernate.cache.use_second_level_cache=true 
spring.jpa.properties.hibernate.cache.use_query_cache=true 
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory 

yüzden EhCacheRegionFactory eksikliğinden şikayetçi Ayrıca pom bu ekledi:

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-ehcache</artifactId> 
</dependency> 

Ama hala entityManager.find(Clazz.class, pk) gibi sorgular önbelleğe alınmış verileri kullanmak yerine DB sorgusunu tetikler.

Nelerin eksik olduğu hakkında bir fikriniz var mı?

+1

Yapılandırma sınıfınızda '@ EnableCaching' işlevini kullanarak veya' 'kullanarak xml dosyasında önbelleğe alma yönetimini etkinleştirdiniz. – Arpit

+0

Sadece Bahar Önbellekleme için kullanılmasına rağmen - sınıf düzeyinde – Daimon

cevap

19

daha buraya kazma bazı ne application.properties eksikti var Eh sonra: o, birileri :)

+0

Thx Daimon, ve bu kadarıyla herkesin gelmesi için, bu cevabın yapılandırmasına ek olarak, her iki yapılandırmaya da ihtiyacınız var. – Xiangyu

+6

'spring.jpa.properties.javax.persistence.sharedCache.mode = ENABLE_SELECTIVE' parametresinin ayarlanması tercih edilir, çünkü sadece 'javax.persistence.Cacheable' notlarınızı kabul eder. –

+0

Bu özelliği ayarlayarak sorunu çözdüm: hibernate.cache.region.factory_class –

0

Sınıf yolunuzda bir ehcache.xml dosyası olmalıdır. Dosya en azından varsayılan önbellek stratejisini içermelidir.

ehcache.xml:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="ehcache.xsd" 
    Name="CacheManager" 
    maxBytesLocalHeap="250m"> 

<defaultCache eternal="true" 
... 
/> 

<cache name="org.hibernate.cache.internal.StandardQueryCache" 
     eternal="true" 
... 
/> 

tüm Tamam olduğundan emin olmak için, uygulama başlatma sırasında aşağıdaki günlüğünü olmalıdır kolay debuging için, sonsuz varlıklar önbellekten tahliye olmadığından emin olmak için yapmak:

Could not find a specific ehcache configuration for cache named [com.yourcompany.YourClass]; Using defaults. 

Bu, varlık önbellek notunuzun doğru bir şekilde okunması ve varsayılan önbelleğin kullanılması anlamına gelir.

entityManager.find(Clazz.class, pk) ile test ediyorsanız, bu sorgu önbelleğini değil, yalnızca varlık önbelleğini desteklemez. Sorgu önbelleği em.createQuery (...) (sorguları için ve

Ayrıca, org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory kullanmak ilişkiler gemi için kullanılır, ancak ben wich iyidir bilmiyorum.

+1

sınıfındaki JPA2 Önbellek'i ('@ javax.persistence.Cacheable' kullandığımı belirtmek için soruyu güncelle) kullanmam gerekirken, 'ehcache.xml' olması önerilir. hiçbir şekilde gerekli değildir. Ehcache size 10.000 öğe ve 120 sn'lik bir TTL sağlayan varsayılan önbellek yapılandırmasını kullanacaktır - bu ayarlanmamıştır, ancak birçoğu için yeterince iyi olan bir başlangıç ​​noktasıdır. Ayrıca, “ehcache.xml” seçeneğinin yeterli olmamasına dikkat ederek, tüm uyarılardan kurtulmak için uygun önbellekleri de tanımlamanız gerekir. –

6

@Daimon gerçekten emin değilim yardımcı olur

spring.jpa.properties.javax.persistence.sharedCache.mode=ALL 

Umut

olsun

en iyi karardır.

Varsayılan olarak Hibernate 20.2.1. Cache mappings documentation section

Alıntı sahibi, kişiler ikinci seviye önbellek parçası değildir ve biz bu ayarda uymanızı öneririz. Ancak, persistence.xml dosyanızdaki paylaşılan önbellek modu öğesini ayarlayarak veya yapılandırmanızdaki javax.persistence.sharedCache.mode özelliğini kullanarak bunu geçersiz kılabilirsiniz.

ENABLE_SELECTIVE (Varsayılan ve tavsiye edilen değer) ise: açıkça önbelleklenebilir olarak işaretlenmiş sürece varlıklar önbelleğe alınmaz.

Yani, sen @ javax.persistence.Cacheable ile daha doğrusu org.hibernate.annotations.Cache @ etkilenen tüm varlıkları açıklamalı değil ki, olabilir? Bu, Etkileşim Önbelleğinin, İkinci Düzey Önbelleği'nde etkilenen varlıkları başarıya ulaşmaya çalıştığı ve her bir öğeyi tek bir seçimle almaya başladığı yol açabilir.

+0

Hayır, durum böyle değildi. spring.jpa.properties.javax.persistence.sharedCache.mode açık bir şekilde ayarlanmalıdır. İster başka bir hikaye olan TÜMÜ ister farklı bir ayar olsun, kendi başına bu sorunla ilgili değil – Daimon

+1

İki sentümü eklemek için: Spring Boot 1.4 ve Ehcache ve Hibernate 5.1 ile en azından bölge fabrikalarını ve paylaşılan önbellek modunu ayarlamak gerekir. "ENABLE_SELECTIVE" varsayılan olarak belgelenmiş olsa bile, bu değeri açıkça ayarlamanız gerekiyor. –

0

Eğer önbelleğe istediğiniz sınıfın üzerine

@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 

eklediniz mi?