2014-06-23 9 views
7

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

मेरे सर्वर क्वेरी डीबी बहुत उच्च आवृत्ति के साथ हाइबरनेट का उपयोग कर।

मैं पहले से ही MaxHeapSize बताएं कि वह 3000 मी है, लेकिन आमतौर पर राम 2.7GB उपयोग करें, यह कम कर सकते हैं, लेकिन वृद्धि की तुलना में धीमी है। कभी-कभी यह 3.6 जीबी मेमोरी उपयोग तक बढ़ता है, मेरे मैक्सहेप आकार से शुरू होने पर परिभाषित होता है।

जब इस्तेमाल किया स्मृति 3.6GB है, मैं -jmap आदेश के साथ यह डंप करने के लिए कोशिश करते हैं और केवल 1.3GB के आकार के साथ एक heapdump मिला है।

इम ग्रहण मेट का उपयोग कर इसे विश्लेषण करने के लिए, यहाँ मुझे लगता है कि हाइबरनेट समस्या है मेट Dominator tree से dominator पेड़ है, मैं इस तरह इतने सारे org.apache.commons.collections.map.AbstractReferenceMap $ ReferenceEntry है। यह कचरा संग्रह द्वारा निपटान नहीं किया जा सकता है या धीमा कर सकते हैं।

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

10

आपके पास आपकी क्वेरी सूची में 250k प्रविष्टियां हैं। यहां तक ​​कि एक मूल क्वेरी डेटाबेस को अपने घुटनों पर रखेगी। ओरेकल प्रदर्शन कारणों से IN क्वेरी सूची को 1000 तक सीमित करता है ताकि आपको वही करना चाहिए।

इसे और अधिक रैम समस्या को हल करने नहीं जा रहा है देते हुए आप पृष्ठांकन का उपयोग करके, ज्यादा से ज्यादा 1000 प्रविष्टियों के बैच के लिए अपने चयन/अद्यतन को सीमित करने की जरूरत है।

Streaming is an option साथ ही, लेकिन, इस तरह के बड़े परिणाम सेट के लिए, keyset pagination आमतौर पर सबसे अच्छा विकल्प होता है।

आप डेटाबेस में सभी प्रसंस्करण कर सकते हैं, तब आप डीबी से अनुप्रयोग के लिए 250k रिकॉर्ड को स्थानांतरित करने के लिए नहीं होगा। एक बहुत अच्छा कारण है कि कई आरडीबीएमएस उन्नत प्रक्रियात्मक भाषाओं (जैसे पीएल/एसक्यूएल, टी-एसक्यूएल) प्रदान करते हैं।

+0

क्या आप मुझे थोड़ा और सिखा सकते हैं? मुझे ऑरैकल डेटाबेस इंटरैक्शन के बारे में थोड़ा सा अनुभव नहीं है। – Viet

+1

आपको एन प्रविष्टियां लाने की आवश्यकता है, उन्हें अपडेट करें और फिर अगले बैच को लाएं और इसी तरह। –

+0

मैं अभी भी उलझन में हूं, मेरी क्वेरी में "अद्यतन .. कहां .. IN (...) ", क्वेरी सूची में छोटा है और यह 1000 तक नहीं पहुंच सकता है। और जब मैं ग्रहण मैट में डोमिनेटर पेड़ के पत्ते तक फैलता हूं, तो मुझे अपनी चुनिंदा क्वेरी ('sqlQueryCheckSet' मेरे कोड में) मिलती है, इसमें से कई, और मुझे लगता है कि केवल यह – Viet

1

Vlad MihalceaHibernate issue पर आपके लिंक के साथ, यह हाइबरनेट पर बग है, यह संस्करण 3.6 पर ठीक है। मैं सिर्फ संस्करण 3.6.10 के लिए मेरी हाइबरनेट संस्करण 3.3.2 अद्यतन करते हैं, "hibernate.query.plan_cache_max_soft_references" (2048) के डिफ़ॉल्ट मान का उपयोग, "hibernate.query.plan_cache_max_strong_references" (128) और मेरी समस्या चला गया है। कोई और उच्च स्मृति उपयोग नहीं।

3

ध्यान दें कि यद्यपि क्वेरी के भीतर ऑब्जेक्ट की संख्या को कॉन्फ़िगर और सीमित किया जा सकता है, लेकिन शायद यह सामान्य नहीं है।

हमारे मामले में हम यह करने के लिए HQL समान में प्रश्नों लिख रहे थे:

hql = String.format("from Entity where msisdn='%s'", msisdn); 

यह queryPlanCache करने के लिए जा एन विभिन्न प्रश्नों में हुई। जब हम इस जिज्ञासा के बदल दिया है: लगभग 0 पर

hql = "from Blacklist where msisnd = :msisdn"; 
... 
query.setParameter("msisdn", msisdn); 

queryPlanCache के आकार में नाटकीय रूप से 100Mb से कम हो गया था यह दूसरा प्रश्न एक एक एकल preparedStament कैश अंदर सिर्फ एक वस्तु जिसके परिणामस्वरूप में अनुवाद किया है।