2012-09-24 13 views
7

मेरा मानना ​​है कि हाइबरनेट का उपयोग करके वस्तुओं को लोड करने के केवल दो तरीके हैं और यह आलसी लोडिंग है और एक उत्सुक लोडिंग है। आलसी लोडिंग के अपने फायदे हैं, यह बहुत सारी वस्तुओं को लोड नहीं कर रहा है, लेकिन केवल तभी जब आपको उनकी आवश्यकता हो। मैंने यह भी सीखा है कि यदि आप किसी ऑब्जेक्ट के लिए सभी बच्चों को लोड करना चाहते हैं तो आप बस parent.getChildren().size() पर कॉल कर सकते हैं। तो चलो कहते हैं कि हम निम्न वस्तुओंजब आलसी लोडिंग/हाइबरनेट में उत्सुक लोडिंग का उपयोग करना है?

@Entity 
public class Customer{ 
public Set<Order> order; 
} 

@Entity 
public class Order{ 
} 

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

मैं समझने की कोशिश कर रहा हूं कि आलसी लोडिंग का उपयोग कहां करें और उत्सुक लोडिंग का उपयोग कहां करें, आपकी अंतर्दृष्टि की अत्यधिक सराहना करें।

उत्तर

19

मैं समझने की कोशिश कर रहा हूं कि आलसी लोडिंग का उपयोग कहां और उत्सुक लोडिंग का उपयोग करने के लिए, आपकी अंतर्दृष्टि की अत्यधिक सराहना करते हैं।

1) आप हमेशा कुछ (यकीन है कि के लिए उपयोग करने के लिए जा रहे हैं), तो आप उत्सुक यह लोड कर सकते हैं:

यहाँ कुछ विचार कर रहे हैं।
2) 1 से संबंधित, यदि आप लगभग कभी भी कुछ उपयोग करने जा रहे हैं, तो आलसी लोड करें।
3) बड़े संग्रह शामिल होने पर आलसी लोडिंग अधिक उपयोगी होती है।
4) उत्सुकता से चीजें लोड करने से प्रदर्शन प्रभावित हिट की संभावित लागत पर सत्र से संबंधित त्रुटियां कम हो जाएंगी।
5) जटिल डेटा मॉडल और/या बड़े डेटाबेस के लिए, आप यह देखने जा रहे हैं कि आपका ऐप आपकी रणनीतियों को समायोजित करने के लिए कैसे लोड करता है।
6) इसे पहली बार सही करना मुश्किल है। जो सही लगता है, करो और यदि आवश्यक हो तो बदलने से डरो मत।
7) बड़े डेटासेट के लिए, आप शायद कस्टम एचक्यूएल/प्रश्नों को लिखने जा रहे हैं, जहां डिफ़ॉल्ट मैपिंग ओवरराइट किया जा सकता है, इसलिए आलसी बनाम उत्सुकता से कोई फर्क नहीं पड़ता।

यदि आप # 6 पर विश्वास करते हैं, तो बहुत आगे की योजना बनाने की कोशिश में फंस न जाएं, और यदि आपको करना है तो इसे बदलें।

WRT अपने विशिष्ट उदाहरण के लिए, मैं शायद डेटा का उपयोग करने के प्रश्नों का एक समूह लिखते थे (बेशक, उचित व्यापार की जरूरत से प्रेरित)

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

जगह पर उन दो प्रश्नों के साथ, मेरी सेवा परतों में मेरे पास ऐसे टूल हैं जो मुझे स्थिति के संदर्भ के आधार पर सही करने के लिए आवश्यक हैं।

+0

मैं पूरी तरह से सहमत हूं, दो अलग-अलग प्रश्न लिखना आलसी/उत्सुक लोडिंग का उपयोग करने से कहीं बेहतर है। इसे स्पष्ट करने के लिए धन्यवाद। –

+0

@hvgotcodes क्या आप समझा सकते हैं कि बिंदु # 7 कैसे प्राप्त करें? –

5

यह link पूरी तरह से आपके प्रश्न का उत्तर देता है।

आलसी लोड हो रहा मामलों में जहां संबंधित इकाई आकार बहुत बड़ा है में प्रयोग किया जाता है और यह दूसरे हाथ पर हर बार दिलवाया जा करने के लिए आवश्यक नहीं है

उत्सुक उचित विश्लेषण के साथ प्रयोग किया जाना चाहिए के रूप में यह संबंध हर बार मुख्य लोड करता है इकाई लोड हो गई है।

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

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