2009-11-05 11 views
8

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

इससे मुझे आश्चर्य होता है कि कुछ निश्चित स्थितियां हैं जहां डेटा-एक्सेस प्रदर्शन आलसी लोडिंग का उपयोग करके चोट पहुंचाता है।

तो मुझे आश्चर्य है कि कब और किस स्थितियों में मुझे अपने एनएचबीरनेट-जारी वस्तुओं में आलसी लोडिंग से बचने चाहिए?

क्या अतिरिक्त प्रसंस्करण समय में आलसी लोडिंग का नकारात्मक पक्ष है, या आलसी लोडिंग को निषेध कर सकते हैं डेटा-एक्सेस समय भी बढ़ा सकते हैं (उदाहरण के लिए, डेटाबेस में अतिरिक्त राउंड-ट्रिप करके)?

धन्यवाद!

उत्तर

19

डेटाबेस से उत्सुक और आलसी लोडिंग ऑब्जेक्ट्स के बीच स्पष्ट प्रदर्शन ट्रेडऑफ हैं।

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

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

तो, सामान्यतः, आप हमेशा "unit of work" के लिए आवश्यक डेटा को पुनर्प्राप्त करना चाहते हैं, और नहीं, कम नहीं। कुछ मामलों में, आपको पता नहीं हो सकता कि आपको क्या चाहिए (क्योंकि उपयोगकर्ता एक जादूगर या कुछ इसी तरह के माध्यम से काम कर रहा है) और उस स्थिति में यह संभवतः आलसी लोड के लिए समझ में आता है।

यदि आप ओआरएम का उपयोग कर रहे हैं और सुविधाओं को तेजी से जोड़ने पर ध्यान केंद्रित कर रहे हैं और बाद में प्रदर्शन करेंगे (जो बेहद आम है और चीजों को करने का एक अच्छा तरीका है), आलसी लोडिंग डिफ़ॉल्ट होने का सही तरीका है । यदि आप बाद में (प्रदर्शन प्रोफाइलिंग/विश्लेषण के माध्यम से) पाते हैं कि आपके पास ऑब्जेक्ट प्राप्त करने के लिए एक प्रश्न है और फिर उस मूल ऑब्जेक्ट से संबंधित एन ऑब्जेक्ट्स प्राप्त करने के लिए एन क्वेरी हैं, तो आप केवल उस कोड को बदल सकते हैं ताकि उत्सुक लोडिंग का उपयोग केवल हिट हो सके एन + 1 बार के बजाय डेटाबेस एक बार (एन + 1 समस्या आलसी लोडिंग का उपयोग करने के लिए एक प्रसिद्ध नकारात्मक पक्ष है)।

+0

लेकिन यदि आप परियोजना इतनी बड़ी हो जाने के बाद आलसी लोडिंग का उपयोग शुरू करते हैं तो कई चीजों को बदलने में देर हो चुकी है। मुझे लगता है कि सबसे अच्छा तरीका यह पता लगाने के लिए है कि आपको एक ही क्वेरी में डेटाबेस से लाने के लिए क्या डेटा चाहिए। इस दृष्टिकोण में आप बाद में इन ऑब्जेक्ट को कैश कर सकते हैं लेकिन आप उन ऑब्जेक्ट्स को कैश नहीं कर सकते हैं जिनमें आलसी लोडिंग है। – Meysam

1

लघु संस्करण यह है:

  1. विकास अगर आप आलसी लोड हो रहा है का उपयोग आसान है। आप केवल प्राकृतिक ओओ तरीके से ऑब्जेक्ट रिश्तों को पार करते हैं, और जब आप इसके लिए पूछते हैं तो आपको वह चाहिए जो आपको चाहिए।
  2. प्रदर्शन आमतौर पर बेहतर होता है यदि आप यह समझते हैं कि आपको इसके लिए पूछने से पहले क्या चाहिए, और डेटाबेस के लिए एक यात्रा में इसके लिए पूछें।

पिछले कुछ वर्षों से हम त्वरित विकास के समय पर ध्यान केंद्रित कर रहे हैं। अब जब हमारे पास एक ठोस ऐप और उपयोगकर्ताबेस है, तो हम अपने डेटा एक्सेस को अनुकूलित कर रहे हैं।

+2

कुल प्रदर्शन बेहतर हो सकता है, लेकिन कभी-कभी बड़े ऑब्जेक्ट ग्राफ़ लोड * स्पष्ट * प्रदर्शन को प्रभावित कर सकते हैं, जो कभी-कभी उपयोगकर्ताओं के लिए एक बड़ा सौदा हो सकता है। –

+1

उत्कृष्ट बिंदु। मूल बातें लोड करें। प्रदर्शन। आवश्यकतानुसार ट्रैवर्स मूल्यों में अजाक्स। (उदाहरण के लिए)। – z5h

3

आलसी लोडिंग के लिए सामान्य व्यापारिक बात यह है कि आप डेटाबेस पर एक छोटी हिट बनाते हैं, लेकिन आप इसे दीर्घकालिक पर अधिक हिट बनाते हैं। आलसी लोडिंग के बिना, आप एक पूरे ऑब्जेक्ट ग्राफ को सामने ले जाएंगे, एक बार डेटा के एक बड़े हिस्से को चूसने लगेगा। यह संभवतः आपके यूआई में अंतराल का कारण बन सकता है, और इसलिए इसे अक्सर निराश किया जाता है। हालांकि, यदि आपके पास एक सामान्य ऑब्जेक्ट ग्राफ़ है (न केवल एक ऑब्जेक्ट - अन्यथा इससे कोई फर्क नहीं पड़ता!) जो आपको पता चलेगा कि बार-बार उपयोग किया जाएगा, और ऊपर से नीचे, फिर इसे एक बार में खींचने का अर्थ होता है।

उदाहरण के तौर पर, यदि आप ऑर्डर मैनेजमेंट सिस्टम कर रहे हैं, तो संभवतः आप सारांश स्क्रीन पर प्रत्येक ऑर्डर या सभी ग्राहक जानकारी की सभी पंक्तियां नहीं खींचेंगे। आलसी लोडिंग इसे होने से रोकती है।

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

2

यदि आप क्लाइंट और सर्वर के बीच एक webservice का उपयोग कर डेटाबेस उपयोग को निबर्ननेट का उपयोग करके प्रबंधित कर रहे हैं तो यह आलसी लोडिंग का उपयोग कर समस्याग्रस्त हो सकता है क्योंकि ऑब्जेक्ट को क्रमबद्ध किया जाएगा और webservice पर भेजा जाएगा और बाद में "ऑब्जेक्ट्स" के उपयोग को आगे बढ़ाया जाएगा ऑब्जेक्ट रिलेशनशिप को अतिरिक्त webservices का उपयोग कर डेटाबेस सर्वर के लिए एक नई यात्रा की जरूरत है। ऐसे उदाहरण में आलसी लोडिंग का उपयोग करके यह बहुत अच्छा नहीं हो सकता है। सावधानी बरतने के लिए, अगर आप आलसी लोडिंग को चालू करते हैं, तो इसके बारे में सोचने में आसान नहीं है, इसके बारे में सोचने के लिए आसान तरीका है ...

0

मैंने कई प्रदर्शन समस्याओं को देखा है Hibernate में गलत लोडिंग व्यवहार विन्यास से aring। मुझे लगता है कि NHBernate के साथ स्थिति काफी समान है। मेरी सिफारिश हमेशा आलसी संबंधों का उपयोग करना है और फिर अपनी क्वेरी में उत्सुक fetting statemetns का उपयोग करना है - जैसे जुड़ें जुड़ें -। यह सुनिश्चित करता है कि आप अधिक डेटा लोड नहीं कर रहे हैं और आप कई SQL क्वेरी से बच सकते हैं।

एक क्वेरी द्वारा उत्सुक आलसी रिलीज करना आसान है। यह दूसरे तरीके से लगभग असंभव है।

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