2009-05-20 17 views
8

मैं वर्तमान में काम पर एक प्रमुख परियोजना के लिए ईजेबी 3 के साथ प्रतिष्ठा के रूप में प्रयोग कर रहा हूं। जिन चीजों में मैं देख रहा हूं उनमें से एक क्वेरी कैशिंग है।हाइबरनेट के साथ क्वेरी कैशिंग पूछताछ क्वेरी को दस गुना धीमा क्यों करती है?

मैंने जेपीए एनोटेशन, एक @ लॉकल बिजनेस इंटरफ़ेस और एक ईजेबी-जेएआर में @ स्टेटलेस कार्यान्वयन के साथ एक बहुत ही सरल डोमेन मॉडल बनाया है, जिसे एक ईएआर में तैनात किया गया है, जिसमें कुछ बुनियादी परीक्षण करने के लिए एक बहुत ही सरल वेबपैप है। EAR को JBoss 5.0.1 डिफ़ॉल्ट कॉन्फ़िगरेशन में कोई संशोधन नहीं किया गया है। यह बहुत कठोर था, और उम्मीद के रूप में काम किया।

  • मैं एक डोमेन वर्ग है कि केवल एक आईडी और एक स्ट्रिंग मान नक्शे है, और है कि विशेष रूप से 10000 के बारे में पंक्तियों बनाया है:

    लेकिन, मेरा नवीनतम परीक्षण शामिल क्वेरी कैशिंग, और मैं कुछ अजीब परिणाम मिला तालिका

  • व्यापार सेम में, वहाँ एक बहुत ही सरल क्वेरी, MyClass मीटर
  • से चयन मीटर कोई कैश के साथ, इस 400 मि.से के बारे में औसतन
  • में कार्यान्वित क्वेरी कैश (क्वेरी पर संकेत के माध्यम से) सक्षम होने के साथ है, पाठ्यक्रम का पहला निष्पादन थोड़ा लंबा लगता है, लगभग 1200 एमएमएस अगले निष्पादन औसत पर 3500ms लेते हैं!

यह मुझे परेशान करता है, इसलिए मैंने लॉग को देखने के लिए हाइबरनेट के show_sql को सक्षम किया। Uncached, और कैश सक्षम के साथ पहले निष्पादन पर, अपेक्षित के रूप में एक चयन लॉग है। जब मुझे कैश हिट मिलनी चाहिए, तो हाइबरनेट डेटाबेस तालिका में प्रत्येक पंक्ति के लिए एक चयन लॉग करता है।

यह निश्चित रूप से धीमी निष्पादन समय की व्याख्या करेगा, लेकिन क्या कोई मुझे बता सकता है कि ऐसा क्यों होता है?

+0

आपको यहां मेरे प्रश्न पर कैश के बारे में कुछ उपयोगी जानकारी मिल सकती है: * http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ –

उत्तर

16

तरीका है कि क्वेरी कैश काम करता है कि यह केवल कैश है आईडी वस्तुओं क्वेरी द्वारा रिटर्न की। इसलिए, आपका प्रारंभिक चयन कथन सभी ऑब्जेक्ट्स को वापस कर सकता है, और हाइबरनेट उन्हें आपको वापस दे देगा और आईडी को याद रखेगा।

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

अब, इससे पहले कि आप सोचें, "यह सुविधा स्पष्ट रूप से टूटा हुआ है", इस तरह से काम करने का कारण यह है कि क्वेरी कैश को दूसरे स्तर के कैश के साथ संगीत कार्यक्रम में काम करने के लिए डिज़ाइन किया गया है। यदि ऑब्जेक्ट्स पहली क्वेरी के बाद एल 2 कैश में संग्रहीत हैं, तो प्रति-आईडी अनुरोधों को पूरा करने के लिए हाइबरनेट वहां दिखाई देगा।

मुझे सलाह है कि आप इस बारे में अधिक जानने के लिए Java Persistence with Hibernate पुस्तक को उठाएं। अध्याय 13 विशेष रूप से क्वेरी को अनुकूलित करने, और कैश को प्रभावी ढंग से उपयोग करने के तरीके को कवर करता है।

+1

ग्रेट, मैं इसे सक्षम करने की कोशिश करूंगा द्वितीय स्तर कैश भी। मुझे यह जगह पसंद है :-) –

+0

यह पुस्तक कुछ साल पुरानी है, क्या यह अभी भी अद्यतित है? –

+0

अच्छा सवाल, नाथन। मैं हाइबरनेट 3.2 का उपयोग कर रहा हूं, और सब कुछ मेरे लिए पूरी तरह से अद्यतित लगता है। पुस्तक में सभी जेपीए 1.0 एनोटेशन भी शामिल हैं, साथ ही जेबॉस सीम के परिचय भी शामिल हैं। क्या हाइबरनेट 3.3 में कोई बड़ी नई विशेषताएं हैं जिन्हें कवर नहीं किया जा सकता है? –

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