2013-02-20 17 views
8

हम हाइबरनेट 4 और ehcache हमारी परियोजना में उपयोग कर रहे हैं। हम ज्यादातर अपरिवर्तनीय वस्तुओं पर काम करते हैं, इसलिए कैशिंग एक ऐसी सुविधा है जो हमारे आवेदन में अच्छी तरह से फिट बैठती है। क्वेरी कैश सक्षम करने का प्रयास करते हैं, हम निम्नलिखित समस्या में पड़ गए:हाइबरनेट कैश: क्या एल 2 कैश में संग्रहीत कैश किए गए क्वेरी द्वारा ऑब्जेक्ट लौटाए जाते हैं?

मान लिया जाये कि हम निम्न इकाई है:

@Entity 
@Table(name = "DOGS") 
@Immutable 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 
class Dog { 
    @Id @Column 
    Long id; 
    @Column 
    String name; 
} 

और क्वेरी:

Criteria criteria = session.createCriteria(Dog.class); 
criteria.add(Restrictions.in("id", ids)); 
criteria.setCacheable(true); 

क्वेरी कैश timeToLive पर सेट है कुत्ते के समय के बारे में 3/4। यहाँ परिदृश्य है (कृपया मुझे सही कर अगर मैं एक गलत धारणा बना):

  1. पहली बार (कैश रिक्त है यह सोचते हैं) क्वेरी कहा जाता है, यह मार डाला जाता है और वापस आ कुत्ता उदाहरणों दूसरे स्तर में जमा हो जाती है कैश। इसके अलावा, डॉग आईडी क्वेरी कैश में संग्रहीत हैं।
  2. दूसरी बार क्वेरी कहलाती है (कुत्ते आईडी क्वेरी कैश में हैं और कुत्ते की वस्तुएं एल 2 कैश में हैं), सब कुछ ठीक काम करता है। क्वेरी कैश आईड्स देता है और कुत्तों को एल 2 से लाया जाता है।
  3. जब क्वेरी कैश समाप्त हो जाता है (लेकिन एल 2 कैश अभी भी मान्य है), क्वेरी फिर से चलती है और कुत्ते के आईडी को कैश करती है।
  4. अब एल 2 कैश कुत्ते ऑब्जेक्ट के लिए समाप्त हो जाता है और सभी वस्तुओं को कैश से निकाल दिया जाता है। क्वेरी कैश में अभी भी कैड्स कैश किए गए हैं, इसलिए हाइबरनेट डॉग ऑब्जेक्ट्स एक को से प्राप्त करता है, जो हमेशा के लिए लेता है।

तीसरा बिंदु मुझे परेशान कर रहा है। क्वेरी कैश को अमान्य हो गया और डेटाबेस पर फिर से चलाया गया, कुत्ते की वस्तुओं को लाया, लेकिन कुत्ते की वस्तुओं को एल 2 कैश में अपडेट नहीं किया गया था। ऐसा लगता है कि क्वेरी ने केवल क्वेरी कैश में कुत्ते आईडी को अपडेट किया है, लेकिन एल 2 कैश नहीं।

क्या एल 2 कैश को अपडेट करने के लिए क्वेरी को मजबूर करने का कोई तरीका है? शायद इस परिदृश्य को अलग-अलग संभाला जाना है?

+0

आप पढ़ सकते हैं सक्षम कर सकते हैं/कैश मोड लिखें, ताकि अपडेट के मामले में ईएच कैश इसका ख्याल रखे। – Phani

+0

इकाई केवल पढ़ी जाती है, जिससे इससे मदद नहीं मिलेगी। –

उत्तर

1

मैं इस कोशिश की और अतीत में मेरे लिए काम किया L2 कैश

//clear the cache entity 
sf.getCache().evictEntity(Dog.class,12345); //Entity with 12345 id 

//or clear a collection 
sf.getCache().evictCollection("com.package.Dog.getCol",12345); //Collections 
//Note: the collection contains the name of the fully qualified class. 

//then, run the query 

आशा है कि यह मदद करता है

+0

जब आप सुझाव देते हैं कि मुझे कैश साफ़ करना चाहिए? अगर मैं हर अनुरोध से पहले इसे साफ़ करता हूं तो इसे कैश रखने का कोई मतलब नहीं है। –

+0

मैंने अनुसूचित घटना (परियोजना तथ्यों के कारण) पर साफ कैश किया था। इसलिए समय-समय पर (निर्धारित समय सिस्टम की टीम से था) हम कैश – victoriza

+0

साफ़ करते हैं, इसलिए यह वास्तव में आपके प्रोजेक्ट डीबी आकार और उपयोग पर निर्भर करता है। सटीक डेटा के बिना अनुमान लगाना असंभव है – victoriza

2

देखें दूसरा स्तर कैश वस्तु के लिए है साफ करने के लिए/POJOs आप कैश्ड हो रही के लिए निर्दिष्ट करें। लेकिन विशिष्ट प्रश्नों के लिए क्वेरी कैश बनाया गया है। तो यह स्वाभाविक लगता है कि दोनों असंबद्ध हैं और दूसरा क्वेरी कैश अपडेट नहीं होगा जब आपका क्वेरी कैश अपडेट हो जाएगा। यही कारण है कि दोनों के लिए अलग विन्यास है। आप या तो Hibernate Documentation या this link या this link को संदर्भित करने में आपकी सहायता कर सकते हैं।

+0

मैं समझता हूं कि ये दो अलग-अलग कैश हैं, हालांकि क्वेरी कैश आईडी द्वारा ऑब्जेक्ट पुनर्प्राप्त करने के लिए डोमेन कैश का उपयोग करता है, है ना? इससे वर्णित समस्या का कारण बनता है, जिसे मुझे अब तक कोई समाधान नहीं मिला है। –

+0

इसलिए, यह उत्तर वर्णित समस्या का समाधान नहीं करता है। –

+0

दोस्त आपको इस डिज़ाइन को स्वीकार करने की आवश्यकता है। यह कोई समस्या नहीं है, यह इस तरह से डिजाइन किया गया है। –

0

मेरे मामले में, मैं हाइबरनेट में न्यूनतम पॉट सेटिंग अक्षम करता हूं और फिर SQL कैश जारी होने पर क्वेरी कैश स्वचालित रूप से सभी संबंधित द्वितीय स्तर कैश को अपडेट कर देगा।

मुझे लगता है कि इससे आपके प्रश्न का "भी L2 कैश अद्यतन करने के लिए क्वेरी के लिए मजबूर करने" का हल है (यह भी मुझे बग एक लंबे समय .....)

<property name="hibernate.cache.use_minimal_puts" value="false"/> 
संबंधित मुद्दे