आलसी लोडिंग बनाम ईगर लोडिंग


79

इकाई ढांचे में आलसी लोडिंग डिफ़ॉल्ट घटना है जो संबंधित संस्थाओं को लोड करने और एक्सेस करने के लिए होती है। हालांकि, इन सभी संबंधों को बल-लोडिंग के अभ्यास के लिए उत्सुक लोडिंग कहा जाता है। मैं इस सवाल के घेरे में आ गया कि आलसी लोडिंग की तुलना में कौन सी स्थिति उत्सुक लोडिंग अधिक फायदेमंद हो सकती है। यह पूछने पर, क्योंकि यह स्पष्ट है कि आलसी लोडिंग अधिक संसाधन के अनुकूल है, और भले ही हम ToList()विधि का उपयोग करते हैं , फिर भी हम आलसी लोडिंग व्यवहार का लाभ उठा सकते हैं। हालाँकि, मैंने सोचा कि शायद आलसी लोडिंग से वास्तविक डेटाबेस के अनुरोधों की संख्या बढ़ जाती है और शायद इसलिए कभी-कभी डेवलपर्स इसका उपयोग करते हैंInlcudeसभी संबंधों को बलपूर्वक लोड करने की विधि। उदाहरण के लिए, MVC 5 में Visual Studio ऑटो-मचान का उपयोग करते समय, अनुक्रमणिका विधि जो कि नियंत्रक में स्वचालित रूप से बनाई जाती है, हमेशा ईगर लोडिंग का उपयोग करती है, और मेरे पास हमेशा यह सवाल है कि Microsoft उस मामले में डिफ़ॉल्ट रूप से ईगर लोडिंग का उपयोग क्यों करता है।

मैं सराहना करता हूं कि अगर कोई मुझे समझाता है कि आलसी लोडिंग की तुलना में कौन सी स्थिति उत्सुक लोडिंग अधिक फायदेमंद होगी, और हम इसका उपयोग बिल्कुल भी क्यों न करें, जबकि आलसी लोडिंग के रूप में कुछ और संसाधन अनुकूल हैं।


8
एक ऐसी स्थिति की कल्पना करें जहां आपका डीबी संदर्भ निपट जाएगा और आलसी लोडिंग अब नहीं हो सकती है। फिर उत्सुक लोडिंग फायदेमंद है।
ट्रांसजेंडेंट

2
मैंने "एन + 1 सिलेक्ट" समस्या के कारण प्रदर्शन की समस्याओं के कारण बहुत सारी परियोजनाएं विफल देखी हैं जो आलसी लोडिंग करते समय तेजी से घटित होंगी, इसलिए यह देखना सुनिश्चित करें
डेविड डीवी

जवाबों:


80

मुझे लगता है कि इस तरह से संबंधों को वर्गीकृत करना अच्छा है

उत्सुक लोडिंग का उपयोग कब करें

  1. एक-से-कई संबंधों के "एक पक्ष" में, जो आपको यकीन है कि हर जगह मुख्य इकाई के साथ उपयोग किया जाता है। एक लेख की उपयोगकर्ता संपत्ति की तरह। उत्पाद की श्रेणी की संपत्ति।
  2. आम तौर पर जब संबंध बहुत अधिक नहीं होते हैं और सर्वर पर आगे के प्रश्नों को कम करने के लिए उत्सुक लोडिंग अच्छा अभ्यास होगा।

आलसी लोडिंग का उपयोग कब करें

  1. लगभग एक-से-कई संबंधों के "संग्रह पक्ष" पर। उपयोगकर्ता या श्रेणी के उत्पाद की तरह
  2. आप वास्तव में जानते हैं कि आपको तुरंत एक संपत्ति की आवश्यकता नहीं होगी।

नोट: जैसा ट्रांसजेंडेंट ने कहा कि आलसी लोडिंग के साथ निपटान की समस्या हो सकती है।


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

क्या मैं दोनों का एक साथ उपयोग कर सकता हूं? उदाहरण के लिए यदि इकाई लगभग दूसरे से संबंधित है तो मैं इसे उत्सुक लोडिंग के माध्यम से शामिल कर सकता हूं, और अन्य संबंधित इकाइयां आलसी लोडिंग के माध्यम से होगी?
अहमद अला

28

ईगर लोड हो रहा है: ईगर लोडिंग आपको एक बार में अपनी सभी आवश्यक संस्थाओं को लोड करने में मदद करता है। अर्थात संबंधित वस्तुएं (चाइल्ड ऑब्जेक्ट) अपने मूल ऑब्जेक्ट के साथ स्वचालित रूप से लोड की जाती हैं।

कब इस्तेमाल करें:

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

आलसी लोडिंग: आलसी लोडिंग के मामले में, संबंधित वस्तुएं (बच्चे की वस्तुएं) अपने मूल ऑब्जेक्ट के साथ स्वचालित रूप से लोड नहीं होती हैं जब तक कि वे अनुरोध नहीं किए जाते हैं। डिफ़ॉल्ट रूप से LINQ आलसी लोडिंग का समर्थन करता है।

कब इस्तेमाल करें:

  1. आलसी लोडिंग का उपयोग करें जब आप एक-से-कई संग्रह का उपयोग कर रहे हों।
  2. आलसी लोडिंग का उपयोग करें जब आप सुनिश्चित हों कि आप संबंधित संस्थाओं का उपयोग तुरंत नहीं कर रहे हैं।

नोट: एंटिटी फ्रेमवर्क संबंधित डेटा को लोड करने के तीन तरीके का समर्थन करता है - उत्सुक लोडिंग, आलसी लोडिंग और स्पष्ट लोडिंग।


मैं वास्तव में उत्सुक और आलसी लोडिंग के बारे में उलझन में हूं। क्या आप मुझे समझ सकते हैं, कृपया! Google के संदर्भ में मैंने इस चीज को आलसी लोडिंग के बारे में बताया। "आपको वर्चुअल कीवर्ड का उपयोग करना चाहिए, जब आप डेटा को आलसी लोडिंग के साथ लोड करना चाहते हैं। आलसी लोडिंग वह प्रक्रिया है जिसके माध्यम से एक इकाई या संस्थाओं का संग्रह स्वचालित रूप से डेटाबेस से पहली बार लोड होता है। एक्सेस 7, 2016" वह है वही बात जो आपने आलसी लोडिंग के बारे में कही थी।
रीकामोल

@rykamol इसे एक डिज़ाइन पैटर्न के रूप में समझने की कोशिश करें। आप बेहतर समझ के लिए यहाँ से संदर्भित कर सकते हैं: उत्सुक लोड हो रहा है - unitframeworktutorial.net/… , आलसी लोडिंग - unitframeworktutorial.net/… , स्पष्ट लोड हो रहा है - unitframeworktutorial.net/EntityFramework4.3/…
डार्क मैटर

20

आलसी लोडिंग कई SQL कॉल का उत्पादन करेगा जबकि ईगर लोडिंग डेटा को "अधिक भारी" कॉल (जॉइन / सबक्वेरी के साथ) के साथ लोड कर सकता है।

उदाहरण के लिए, यदि आपके वेब और sql सर्वरों के बीच एक उच्च पिंग है तो आप संबंधित लोडिंग सामानों को लोड-लोडिंग लोड के साथ 1-बाय -1 के बजाय ईगर लोडिंग के साथ जाएंगे।


क्या मैं दोनों को एक साथ उपयोग कर सकता हूं? उदाहरण के लिए यदि इकाई लगभग दूसरे से संबंधित है तो मैं इसे उत्सुक लोडिंग के माध्यम से शामिल कर सकता हूं, और अन्य संबंधित संस्थाएं आलसी लोडिंग के माध्यम से होंगी?
अहमद अला

12

नीचे की स्थिति पर विचार करें

public class Person{
    public String Name{get; set;}
    public String Email {get; set;}
    public virtual Employer employer {get; set;}
}

public List<EF.Person> GetPerson(){
    using(EF.DbEntities db = new EF.DbEntities()){
       return db.Person.ToList();
    }
}

अब इस विधि को कॉल करने के बाद, आप Employerइकाई को लोड नहीं कर सकते । क्यों? क्योंकि dbवस्तु का निपटान हो गया है। तो आपको Person.Include(x=> x.employer)मजबूर होना पड़ेगा कि लोड किया जाए।


3
हां, वह उदाहरण है जब आलसी लोड करने में मदद नहीं करता है। एक और बात यह है कि DbContext को हर बार बनाने के लिए आपको कुछ डेटा की आवश्यकता होती है जो खराब तरीका है। यदि आप कुछ IoC कंटेनर हैं, तो आपका DbContext अनुरोध (वेब ​​ऐप्स के मामले में) के साथ रहेगा।
मिरोस्लाव होलेक 15

@ मिरोस्लावहोलेक: शानदार, यही मैं वास्तव में निनजे का उपयोग कर रहा हूं। आपने अभी जो उल्लेख किया है वह वास्तव में बहुत अच्छा है।
पारगमन

8

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

आलसी लोडिंग जब आपको उपयोगकर्ताओं को केवल पृष्ठ पर दिखाना होता है, और उपयोगकर्ताओं पर क्लिक करके आपको उपयोगकर्ता विवरण दिखाने की आवश्यकता होती है तो आपको आलसी लोडिंग के साथ जाना होगा। आलसी लोडिंग कई हिट बनाते हैं, संबंधित संस्थाओं को लोड करने के लिए जब आप संबंधित संस्थाओं को बांधते हैं।


3

आलसी लोडिंग - अच्छा है जब पेजिंग पर हैंडलिंग के साथ जैसे उपयोगकर्ताओं की पेज लोड सूची दिखाई देती है जिसमें 10 उपयोगकर्ता होते हैं और जैसा कि उपयोगकर्ता पृष्ठ को नीचे स्क्रॉल करता है एक एपीआई कॉल अगले 10 उपयोगकर्ताओं को लाता है। अच्छा है जब आप एनिटायर डेटा लोड नहीं करना चाहते हैं एक बार जब यह अधिक समय लेगा और खराब उपयोगकर्ता अनुभव देगा।

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


-1

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

पूर्व-:

Eager loading

var customers= _context.customers.Include(c=> c.membershipType).Tolist();

lazy loading

मॉडल में ग्राहक को परिभाषित करना होगा

Public virtual string membershipType {get; set;}

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


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

#FakeCaleb ने टिप्पणी को हटा दिया है
नुवान

एक मॉड ने मेरी टिप्पणी को हटा दिया, मैंने इस बातचीत को जारी रखने में कोई बात नहीं देखी क्योंकि आपने अपनी प्रतिक्रिया से मेरी टिप्पणी को किसी भी तरह से गलत समझा
FakeCaleb

आपने सटीक बिंदु का उल्लेख नहीं किया और कहा कि मेरी टिप्पणी पूरी तरह से भ्रामक है, यदि आप उल्लेख करते हैं कि वे कौन से बिंदु हैं जो गलत हैं मैं भी सीख सकता हूं।
नुवान धनुष्का

मुझे लगता है कि आपको यह कहने के कारण लगता है कि प्रदर्शन के कारण आलसी लोडिंग की तुलना में उत्सुक लोडिंग बेहतर है। मैं उन परिदृश्यों के बारे में सोच सकता हूं जहां यह सच नहीं है।
फेकलेब

-2
// Using LINQ and just referencing p.Employer will lazy load
// I am not at a computer but I know I have lazy loaded in one
// query with a single query call like below.
List<Person> persons = new List<Person>();
using(MyDbContext dbContext = new MyDbContext())
{
    persons = (
        from p in dbcontext.Persons
        select new Person{
            Name = p.Name,
            Email = p.Email,
            Employer = p.Employer
        }).ToList();
}

1
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जान सकते हैं।
वह युपी He 一 Y

1
यह उत्तर ओपी प्रश्न को बिल्कुल भी संबोधित नहीं करता है। ओपी यह नहीं पूछ रहा है कि कैसे करना है Lazy loading, वह "कब उपयोग करना है Lazy loadingऔर कब Eager Loading" के बारे में पूछ रहा है
मिशा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.