2013-10-22 9 views
11

मैं जावा/हाइबरनेट एप्लिकेशन के भीतर अक्षम जुड़ने का पता लगाने और अनुकूलित करने का प्रयास कर रहा हूं। मैंने देखा है कि कुछ मामलों में, परिणामों के सेट में जुड़ने के तरीके की प्रकृति के कारण, ओवर-द-वायर डेटा प्रवाह बहुत अक्षम है।हाइबरनेट का उपयोग करके परिणाम सेट आकार को कैसे ट्रैक करें?

मुझे एक उदाहरण प्रदान करने दें। मान लीजिए आप एक HQL क्वेरी है कि इस तरह दिखता है:

select s from Store s 
left join fetch s.items i 
left join fetch s.employees e 
left join fetch s.customers c 
where s.id = :id 

(एक पल है कि यह एक स्मार्ट क्वेरी नहीं है के लिए ध्यान न दें - यह सिर्फ एक सरल उदाहरण है)।

यदि आप कल्पना करते हैं कि किसी दिए गए स्टोर में 1000 आइटम और 10 कर्मचारी और 100 ग्राहक हैं, तो आप 1111 इकाइयों के साथ एक जावा ऑब्जेक्ट पेड़ वापस ले लेंगे। इससे आपको यह सोचने में कमी हो सकती है कि डेटाबेस से लगभग 1111 पंक्तियां लौटा दी गईं, जबकि वास्तव में परिणाम सेट में 1,000,000 पंक्तियां थीं!

सभी कॉलम की उपस्थिति इससे भी बदतर हो जाती है। यदि आप कल्पना करते हैं कि प्रत्येक तालिका में 5 कॉलम थे, तो आप कल्पना कर सकते हैं कि आपको लगभग 5555 "आइटम" वापस मिल गए हैं, जबकि परिणाम सेट में कक्षों (पंक्ति * कॉलम) की संख्या वास्तव में 20,000,000 थी।

स्पष्ट रूप से, यह एप्लिकेशन डेवलपर की ज़िम्मेदारी है कि इस मुद्दे से अवगत रहें और इस तरह से प्रश्न न लिखें। हालांकि, यह कभी-कभी अनजाने में होता है (और कम गंभीर तरीकों से), और यह किसी भी तरह से इन परिस्थितियों की पहचान करने के लिए आवेदन करने में सक्षम होना बहुत अच्छा होगा।

हालांकि, मैं या तो कच्चे परिणाम सेट में पंक्तियों की संख्या या स्तंभों की संख्या की गणना करने के लिए कोई रास्ता नहीं ढूंढ पाया है। न तो हाइबरनेट इंटरसेप्टर, हाइबरनेट घटनाएं, न ही हाइबरनेट आंकड़े इस जानकारी तक पहुंच प्रदान करते हैं।

कोई सुझाव? अग्रिम में धन्यवाद।

+2

अच्छी तरह से आप हमेशा एक ही क्वेरी का उपयोग कर सकते हैं लेकिन इसे निष्पादित करने से पहले गिनती (*) के साथ :) – Apostolos

+0

हाँ, यह काम करेगा, संभावित रूप से (संभावित रूप से) प्रत्येक क्वेरी के लिए निष्पादन समय को दोगुना करने की लागत पर, इसलिए यह निश्चित रूप से एक अपूर्ण है समाधान :) –

+0

क्वेरी नहीं कर सकता .list() आकार() रिकॉर्ड्स की गिनती देता है? –

उत्तर

-1

पंक्ति गणना? "गिनती का चयन करें ..." (इसे दो बार निष्पादित करने की तरह नहीं है। गणना बहुत तेज़ी से निष्पादित होती है) कॉलम गिनती? प्रतिबिंब। Class.getDeclaredMethods() के साथ बेवकूफ;

0

हाइबरनेट एक बहुत जटिल ढांचा है। जैसा कि आप देख सकते हैं कि कच्चे जेडीबीसी की तुलना में यह कुल निष्पादन समय का उपभोग करता है। और आपकी क्वेरी necesarally 1111 ऑब्जेक्ट्स नहीं बनाएगी, क्योंकि हाइबरनेट कैचिंग, सेकेंड लेवल कैश और प्रॉक्सी ऑब्जेक्ट्स के लिए अन्य अंधेरे तकनीक का उपयोग करता है और कॉन्फ़िगरेशन के आधार पर कुछ मेमोरी बचाता है।

हालांकि, यदि आप अपने जावा कोड से कुछ आंकड़ों की गणना करने के लिए कोई रास्ता ढूंढ रहे हैं, तो आपको हाइबरनेट आंकड़ों का उपयोग करना चाहिए, वे कुछ मामलों में बहुत उपयोगी हैं, सुनिश्चित करें कि उन्होंने आपके लिए काम नहीं किया है?

QueryStatistics queryStats = stats.getQueryStatistics("from Store s"); 
queryStats.getCacheHitCount(); 
queryStats.getCacheMissCount(); 
queryStats.getCachePutCount(); 
queryStats.getExecutionCount(); 
queryStats.getExecutionAvgTime(); 
queryStats.getExecutionMaxTime(); 
queryStats.getExecutionMinTime(); 
queryStats.getExecutionRowCount(); 

SecondLevelCacheStatistics cacheStats = stats.getSecondLevelCacheStatistics("Sale.cache"); 
cacheStats.getElementCountInMemory(); 
cacheStats.getElementCountOnDisk(); 
cacheStats.getEntries(); 
cacheStats.getHitCount(); 
cacheStats.getMissCount(); 
cacheStats.getPutCount(); 
cacheStats.getSizeInMemory(); 

CollectionStatistics collectionStats = stats.getCollectionStatistics("Sale.items"); 
collectionStats.getFetchCount(); 
collectionStats.getLoadCount(); 
collectionStats.getRecreateCount(); 
collectionStats.getRemoveCount(); 
collectionStats.getUpdateCount(); 

और वहाँ http://www.javalobby.org/java/forums/t19807.html

2

एक परियोजना है कि एक प्रॉक्सी JDBC ड्राइवर, यह एसक्यूएल (बाँध तर्क के साथ जोड़ा) के साथ-साथ समय आंकड़े प्रवेश कर सकते हैं प्रदान करता है log4jdbc कहा जाता है, कनेक्शन खुला नहीं है पता लगाने के लिए और भी विकल्प हैं और करीबी घटनाएं, यहां तक ​​कि परिणाम सेट करें। कई कांटे हैं, कम से कम एक (जिसे log4jdbc-remix कहा जाता है) लॉग परिणाम परिणाम तालिकाओं के रूप में।

मुझे लगता है कि jdbc.sqltiming का उपयोग करने से मुझे लगता है कि समस्याएं कहां हैं, यह इंगित करने के लिए पर्याप्त होना चाहिए, तो यदि आपको आवश्यकता हो तो आप अन्य विकल्पों के साथ ड्रिल कर सकते हैं। लेकिन यह परिणाम गणना करने के लिए इस पर हैक करने में सक्षम लगता है।

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

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