2012-11-26 16 views
12

मैं एक बड़ी ईआरपी परियोजना पर काम कर रहा हूं जिसमें 2100 टेबल के साथ डेटाबेस मॉडल है। हाइबरनेट के साथ मैप किए गए "केवल" 500 टेबल के साथ, वेब सर्वर पर तैनात एप्लिकेशन को लगभग 3 जीबी मेमोरी मेमोरी होती है।बड़ी संख्या में टेबल और हाइबरनेट मेमोरी खपत

क्या एक दृढ़ता इकाई में कई तालिकाओं का उपयोग करते समय हाइबरनेट के मेटामोडेल मेमोरी पदचिह्न को कम करने का कोई तरीका है? या मुझे ओआरएम पर छोड़ देना चाहिए और सादे पुराने जेडीबीसी (या यहां तक ​​कि jOOQ) के साथ जाना चाहिए?

अभी मैं हाइबरनेट 4.1.8, स्प्रिंग 3.1.3, जेबॉस एएस 7.1 और एमएसएसक्यूएल डेटाबेस के साथ काम कर रहा हूं।

संपादित करें: -:

JavaMelody memory histogram output 2000 के साथ परीक्षण तालिकाओं कि मूल db मॉडल (इसलिए 'केवल' खर्च स्मृति की 1.3GB)

संपादित 2 से दायरे में थोड़ा छोटा होता है उत्पन्न

जावा मेट ढेर विश्लेषण:

+0

क्या आप जानते हैं 3GB का कितना हाइबरनेट से भस्म कर रहे हैं? – Kai

+0

ध्यान में रखते हुए कि ~ 10 टेबल मेमोरी के साथ 256 एमबी से कम है, मैं इसके 2.74 जीबी के उत्तर का आकलन करूंगा :) – Vedran

+1

क्या आप बैटू जेपीए को एक शॉट देना चाहते हैं। http://batoo.jp –

उत्तर

2

मुझे एक ही समस्या का सामना करना पड़ता है, और मैं xGB से 30M तक मेमोरी उपभोग को सफलतापूर्वक कम करता हूं, buildSessionFactory पास 2min से 7 सेकेंड तक बनाता है।

समाधान का एक महत्वपूर्ण भाग यहाँ पोस्ट किया जाता है

postInstantiate buildSessionFactory slow/memory huge database

4

मैं कहाँ है या जो अधिकतम स्मृति लगता है और परिणाम आप क्या परिवर्तन आवेदन में किया जाना चाहिए पर निर्णय लेना चाहिए की रूपरेखा पर आधारित है java melody का उपयोग कर पता लगाने के लिए उत्पादन या मंचन में आवेदन की रूपरेखा करने के लिए सुझाव है।

जावा राग को एकीकृत करने और कॉन्फ़िगर करने के लिए बहुत आसान है और उत्पादन में आप सक्षम या बस web.xml

+0

ऐसा करने का प्रयास करने के लिए कल और परिणामों के साथ प्रश्न अपडेट करें, सुझाव के लिए धन्यवाद। – Vedran

+0

JavaMelody से मेमोरी हिस्टोग्राम जोड़ा गया। – Vedran

+0

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

5

एक खुला हाइबरनेट सत्र को अपडेट करके निष्क्रिय कर सकते हैं वस्तुओं अर्जित करने के लिए के रूप में यह उपयोग में है लगते हैं। यह एक स्मृति रिसाव नहीं है; एक हाइबरनेट सत्र को अनुरोध के लिए एक बार उपयोग करने के लिए डिज़ाइन किया गया है, और यह उन वस्तुओं को कैश करता है जो लगातार हैं (यानी सत्र के भीतर रहते हैं), साथ ही क्वेरी और अन्य डेटा भी। यदि आप session.toString() पर कॉल करते हैं, तो आप सत्र में रहने वाली वस्तुओं की कपड़े धोने की सूची देखेंगे।

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

session.clear() बुला के बाद, उस ऑब्जेक्ट लोड करने से पहले इस कॉल अलग राज्य में वापस आ जाएगा, और अब वर्तमान सत्र के लिए सक्रिय हैं बारे में पता होना।

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

आप आंकड़े है कि आप मदद कर सकते हैं इकट्ठा करने के लिए हाइबरनेट कॉन्फ़िगर कर सकते हैं:

sessionFactory.getStatistics().setStatisticsEnabled(true); 
1

अपने हाइबरनेट वस्तु के लिए उद्देश्य क्या है, हाइबरनेट, दही (बनाएं, अपडेट करें पढ़ते हैं, हटाना) के लिए ही उपयुक्त है, लेकिन caculation के लिए अनुपयुक्त।किसी भी caculation उद्देश्य (विशेष रूप से पार मेज) के लिए, स्टोर प्रक्रिया और ibatis का उपयोग कर बेहतर है।

+1

परियोजना की आवश्यकता कई आरडीबीएमएस लक्ष्यीकरण (यानी ओरेकल, पीजीएसक्यूएल, एमएसएसक्यूएल, माईएसक्यूएल ...) है जो दुख की बात है कि इबैटिस को बहुत (बहुत महंगा) महंगा विकल्प बनाता है। इसके अलावा, मैं बहुत असहमत हूं कि हाइबरनेट केवल सीआरयूडी संचालन के लिए उपयुक्त है। – Vedran

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