2015-07-23 7 views
12

मैं जेपीए 2 के साथ स्प्रिंग बूट 1.2.5 का उपयोग कर रहा हूं ताकि इकाइयों को एनोटेट किया जा सके (और जेपीए कार्यान्वयन को कम करने के रूप में हाइबरनेट)।स्प्रिंग बूट + जेपीए 2 + हाइबरनेट - दूसरे स्तर के कैश को सक्षम करें

मैं, कि सेटअप में दूसरे स्तर कैश का उपयोग करें ताकि संस्थाओं @javax.persistence.Cacheable

साथ एनोटेट गया मैं भी application.properties में निम्नलिखित जोड़ा चाहता था:

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 

बूटअप हाइबरनेट दौरान EhCacheRegionFactory की कमी के बारे में शिकायत तो मैं भी पोम को यह कहा:

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

लेकिन फिर भी entityManager.find(Clazz.class, pk) तरह प्रश्नों हैं कैश किए गए डेटा का उपयोग करने के बजाय डीबी क्वेरी फायरिंग।

कोई विचार क्या गुम है?

+1

आशा है कि आप '@ कैश: एनोटेशन-संचालित />' का उपयोग करके '@ EnableCaching' या xml फ़ाइल में अपने कॉन्फ़िगरेशन क्लास में कैशिंग प्रबंधन सक्षम करें। – Arpit

+0

हालांकि यह केवल स्प्रिंग कैशिंग के लिए उपयोग किया जाता है - मैं कक्षा स्तर – Daimon

उत्तर

19

खैर के बाद कुछ और यहाँ खुदाई क्या मैं application.properties में याद आ रही थी है:

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

आशा है कि यह मदद करता है किसी को :)

+0

Thx Daimon, और किसी के लिए यह अब तक आ रहा है, यह ध्यान देने योग्य है कि इस प्रश्न की कॉन्फ़िगरेशन के अतिरिक्त, आपको प्रश्न से कॉन्फ़िगरेशन दोनों की आवश्यकता है। – Xiangyu

+6

'spring.jpa.properties.javax.persistence.sharedCache.mode = ENABLE_SELECTIVE' सेट करना बेहतर है क्योंकि केवल तभी आप अपने' @ javax.persistence.Cacheable' एनोटेशन का सम्मान करेंगे। –

+0

मैंने इस संपत्ति को सेट करके समस्या का समाधान किया: hibernate.cache.region.factory_class –

0

आपके क्लासपाथ में एक ehcache.xml फ़ाइल होनी चाहिए। फ़ाइल में कम से कम डिफ़ॉल्ट कैश रणनीति होनी चाहिए।

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" 
... 
/> 

यह सुनिश्चित करें कि सब ठीक है, तो आपको निम्न लॉग आपके आवेदन स्टार्टअप के दौरान होना चाहिए आसान debuging के लिए, यह अनन्त यकीन है कि संस्थाओं कैश से बेदखल नहीं कर रहे हैं होने के लिए करते हैं:

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

इसका मतलब है कि आपके इकाई कैश एनोटेशन सही ढंग से readed किया गया है और डिफ़ॉल्ट संचय इस्तेमाल किया जाएगा।

यदि आप entityManager.find(Clazz.class, pk) के साथ परीक्षण करते हैं जो क्वेरी कैश को envolve नहीं है, लेकिन केवल इकाई कैश है। क्वेरी कैश प्रश्नों के लिए (em.createQuery (...) और संबंधों जहाज

इसके अलावा, मैं org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory का उपयोग के लिए प्रयोग किया जाता है, लेकिन मैं नहीं जानता कि जो बेहतर है।

+1

पर जेपीए 2 कैशिंग का उपयोग करने के लिए अद्यतन करता हूं (यह संकेत करने के लिए अद्यतन प्रश्न है कि मैं '@ javax.persistence.Cacheable' का उपयोग कर रहा हूं) जबकि यह सलाह दी जाती है कि 'ehcache.xml' है, यह किसी भी तरह से आवश्यक नहीं है। Ehcache डिफ़ॉल्ट कैश कॉन्फ़िगरेशन का उपयोग करेगा जो आपको 10.000 तत्व और 120 के टीटीएल देता है - यह ट्यून नहीं किया गया है, लेकिन यह एक प्रारंभिक बिंदु है जो कई लोगों के लिए पर्याप्त है। ध्यान दें कि 'ehcache.xml' होने के लिए पर्याप्त नहीं है, आपको सभी चेतावनियों से छुटकारा पाने के लिए उचित कैश को भी परिभाषित करना होगा। –

6

@Daimon मैं सच में यकीन नहीं है, चाहे

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

सबसे अच्छा निर्णय है।

से Hibernate 20.2.1. Cache mappings documentation section

डिफ़ॉल्ट रूप से उद्धृत, संस्थाओं दूसरे स्तर कैश का हिस्सा नहीं हैं और हम आप इस सेटिंग से चिपक सलाह देते हैं। हालांकि, आप अपने persistence.xml फ़ाइल में साझा-कैश-मोड तत्व को सेट करके या अपनी कॉन्फ़िगरेशन में javax.persistence.sharedCache.mode प्रॉपर्टी का उपयोग कर इसे ओवरराइड कर सकते हैं।

जबकि

ENABLE_SELECTIVE (डिफ़ॉल्ट और सिफारिश की मूल्य): संस्थाओं कैश नहीं कर रहे हैं जब तक स्पष्ट संचित करने योग्य के रूप में चिह्नित।

तो, यह हो सकता है, कि आप @ javax.persistence.Cacheable साथ या बल्कि @ org.hibernate.annotations.Cache सभी प्रभावित संस्थाओं एनोटेट नहीं किया है? इससे प्रभावित हो सकता है, कि क्वेरी कैश ने सफलता के बिना द्वितीय स्तर के कैश में प्रभावित इकाइयों को देखने की कोशिश की और फिर प्रत्येक इकाई को एक ही चयन से लाने शुरू कर दिया।

+0

नहीं, यह मामला नहीं था। spring.jpa.properties.javax.persistence.sharedCache.mode स्पष्ट रूप से सेट किया जाना है। चाहे यह सभी या अलग सेटिंग है जो एक और कहानी है और इस समस्या से संबंधित नहीं है – Daimon

+1

मेरे दो सेंट जोड़ने के लिए: स्प्रिंग बूट 1.4 और एशैच और हाइबरनेट 5.1 के साथ आपको वास्तव में कम से कम क्षेत्र फ़ैक्टरी और साझा-कैश-मोड सेट करने की आवश्यकता है। भले ही 'ENABLE_SELECTIVE' को डिफ़ॉल्ट होने के लिए प्रलेखित किया गया हो, फिर भी मुझे इसे इस मान पर सेट करने की आवश्यकता है। –

0

आप वर्ग आप कैश करने के लिए चाहते हैं पर

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

चयन किया है?

संबंधित मुद्दे