2010-01-28 17 views
9

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

समस्या एन + 1 चयन है। उदाहरण, मैं सभी पोस्ट और उसके उपयोगकर्ताओं को चाहता हूं कि मैं आलसी लोड उपयोगकर्ताओं को, मुझे पदों के लिए एक चयन की आवश्यकता है, साथ ही प्रत्येक उपयोगकर्ता के लिए एन चयन करें।

लेज़ी लोड हो रहा है: select .....from post inner join user on post.UserId = user.Id

लेकिन देख एफई उत्पन्न एसक्यूएल, -

1:

1 - - select ....from post
एन select ....from user

"अच्छा" दृष्टिकोण एक में शामिल होने के कर रहा है मुझे एहसास हुआ कि बहुत सारे डेटा बर्बाद हो गए हैं। कल्पना करें कि सभी पोस्ट एक ही उपयोगकर्ता हैं। इनर जॉइन प्रत्येक पोस्ट पंक्ति के लिए सभी उपयोगकर्ता कॉलम लाएगा।

प्रदर्शन में, कौन सा दृष्टिकोण सर्वोत्तम है?

+0

यह एक अच्छा सवाल है - कैसे चुनें - लेकिन मुझे लगता है कि उत्तर डेटा पर बहुत निर्भर करेगा।हालांकि, मुझे लगता है कि आप आश्चर्यचकित होंगे कि आपकी आवश्यकता से अधिक लौटने से कई प्रश्न अक्सर "डेटा बर्बाद" से भी बदतर होते हैं। दूसरे शब्दों में, ऐसे मामले हैं जहां आलसी लोडिंग अच्छी है, लेकिन "ठेठ" अनुप्रयोगों में आश्चर्यजनक रूप से कुछ हैं। –

+0

आपका उत्तर भी आपके ओआरएम पर निर्भर करता है, क्योंकि ईएफ में, आपके उदाहरण का उपयोग करने के लिए, ये केवल दो विकल्प नहीं हैं। –

+0

@ क्रेग स्टंटज़ कौन सा विकल्प? मैं ईएफ 4 –

उत्तर

10

आलसी लोडिंग न तो अच्छा है और न ही बुरा है। एक और अधिक लंबा विवरण के लिए देखें:

When should one avoid using NHibernate's lazy-loading feature?

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

+1

+1 का उपयोग कर रहा हूं, मुझे लगता है कि सामान्य नियम डीबीए को पसंद नहीं है और वेब एप्लिकेशन डेवलपर ऐसा करते हैं :) –

+0

के लिए कोड-केवल =) –

1

आलसी लोडिंग के लिए कोई बुरा और अच्छा नहीं है। आपको यह तय करना होगा कि क्या आप रन टाइम या एप्लिकेशन लोडिंग समय पर संसाधन लोड करना पसंद करते हैं। उदाहरण के लिए - वास्तविक समय आमतौर पर रनटाइम पर संसाधन आवंटित करने से बचने के लिए बफर का उपयोग करता है। यह आलसी लोडिंग के विपरीत है और रीयल टाइम सॉफ्टवेयर के लिए फायदेमंद है।

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

4

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

4

मेरे अधिकांश अनुप्रयोगों में सेवा सीमा (वेब ​​सेवा, डब्ल्यूसीएफ, आदि) शामिल है और उस बिंदु पर ओआर/एम पर आलसी लोडिंग व्यर्थ है, और आपकी सेवा के शीर्ष पर बैठे आपकी इकाइयों में आलसी लोडिंग लागू करना दयालु है एक बुरा विचार (संस्थाओं को अब सेवा के बारे में पता होना चाहिए)।

0

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

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