2012-01-24 12 views
6

मैं Criteria vs HQL का उपयोग करने के लिए हाइबरनेट और स्थितियों से गुज़र रहा था और मेरी समझ यह है कि जब भी हम या HQL द्वारा डेटाबेस से पूछताछ कर रहे हैं, तो दोनों बार हाइबरनेट को परिणाम सेट मिलेगा और स्मृति में डाल दिया जाएगा और फिर जब हम उसे कॉल करेंगे फिर से पूछताछ करें, डेटा को मेमोरी से लाया जाएगा, फिर उस डेटाबेस को मारकर, क्या मेरी समझ सही है?क्या एचक्यूएल क्वेरी हमेशा डेटाबेस हिट करती है और परिणाम प्राप्त करती है?

जैसा कि आप नीचे उल्लिखित प्रश्नों से टिप्पणियों से देख सकते हैं, यह सुझाव दिया गया था कि हाइबरनेट मानदंड सत्र से डेटा प्राप्त करेगा और एचक्यूएल हमेशा डेटाबेस पर जाकर हिट करेगा और इसलिए एचक्यूएल क्वेरी में कई कॉलों की संख्या जाएगी और डेटाबेस हिट होगा और यदि यह मामला है तो HQL हल करने से अधिक समस्याएं पैदा करता है।

कृपया इस पर सलाह दें कि स्थिति के साथ थोड़ा उलझन में है।

संदर्भ question

उत्तर

7

को यह प्रश्नों की किस तरह आप कर रहे हैं पर और अपने कैश सेटिंग्स के बारे में निर्भर करता है।

हाइबरनेट में तीन प्रकार के कैश हैं: सत्र कैश, क्वेरी कैश और दूसरा स्तर कैश। सत्र कैश हमेशा चालू रहता है लेकिन अन्य दो अक्षम किए जा सकते हैं।

आमतौर पर कैशिंग एचक्यूएल या इसके विपरीत मानदंड एपीआई का पक्ष लेने का कारण नहीं है। वे अनिवार्य रूप से एक ही चीज़ के लिए ज्यादातर अलग-अलग इंटरफेस हैं।

http://www.javalobby.org/java/forums/t48846.html और http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

+1

AFAIK एक एचक्यूएल क्वेरी केवल क्वेरी कैश का उपयोग करेगी और क्वेरी और सभी पैरामीटर समान होने पर केवल परिणाम प्राप्त करेंगे। – Thomas

+0

इसलिए यदि मैं + test.class.getName() + SORT_BY_ID से "" बना रहा हूं; ', मैं यह कैसे तय कर सकता हूं कि यह स्मृति या डेटाबेस को मार रहा है, हम हाइबरनेट v3.2 में कैश सेटिंग्स का प्रबंधन कैसे कर सकते हैं? – Rachel

+0

@ जुहा: तो अब जब आप कहते हैं कि सत्र हमेशा डिफ़ॉल्ट रूप से होता है तो एचक्यूएल को सत्र से सीधे परिणाम मिलना चाहिए और डेटाबेस को फिर से हिट नहीं करना चाहिए? – Rachel

1

मूल रूप से यदि आप जेनरेट कर रहे हैं तो आप शायद प्रश्नों डेटाबेस हिट करने के लिए जा रहे हैं देखो, यह करने के लिए अपवाद यदि आप क्वेरी और मानकों को कैश किया गया है।

हाइबरनेट क्वेरी (चाहे आप मानदंड या एचक्यूएल का उपयोग करें) केवल सत्र कैश (प्रथम स्तर कैश) से इकाइयों को वापस कर देगा यदि आप इसे @Id के साथ प्राप्त करते हैं।

आदेश एक प्रश्न आप निम्न सिंटैक्स का उपयोग कर सकते हैं कैश करने के लिए में:

session.createQuery("from X as x").setCacheable(true); 

संपादित टिप्पणियों के लिए:

एक क्वेरी @Id के साथ एक मिल के रूप में ही नहीं है। अपने आईआईडी द्वारा ऑब्जेक्ट प्राप्त करने के लिए आप कुछ लिखेंगे:

Entity myEntity = sessionFactory.getCurrentSession().get(Entity.class, 1); 
+0

क्या आप हाइबरनेट क्वेरी का उदाहरण दे सकते हैं जो इसे '@ आईडी' – Rachel

+0

के साथ प्राप्त करता है। ऐसा कुछ प्राथमिक कुंजी (@Id) session.createQuery ("Entity e जहां e.id =?") के साथ लाने के लिए HQL का उपयोग करता है .setParameter (1, आईडी) –

+0

यह सत्र कैश को हिट नहीं करेगा। आप एक क्वेरी बना रहे हैं जो सत्र कैश को बाईपास कर देगा और सीधे डेटाबेस पर जायेगा। यदि आप @Id द्वारा लोड या सत्र पर प्राप्त करना चाहते हैं। –

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