2009-03-17 11 views
6

डोमेन क्लास में fetchMode को "उत्सुक" सेट करने के लिए कुछ सामान्य दिशानिर्देश क्या हैं? लाने के पेशेवरों और विपक्ष मोड "उत्सुक" बनाम डिफ़ॉल्ट "आलसी" बनाम?Grails/GORM डिफ़ॉल्ट fetch रणनीति: fetchMode को "उत्सुक" कब सेट करें? (उत्सुक बनाम आलसी)

कृपया "उत्सुक" (fetchMode = उत्सुक) का उपयोग करने के दौरान दिखाए जाने वाले कुछ विशिष्ट उदाहरण/उपयोग-मामलों को शामिल करें, और जब नहीं (fetchMode = आलसी)।

उत्तर

16

असल में आलसी लोडिंग के पास उत्सुक विकल्प (प्रदर्शन, संसाधनों का उपयोग) से अधिक लाभ हैं। चूंकि यह सभी रिश्तों के लिए डिफ़ॉल्ट grails सेटिंग है (Grails 1.1 के बाद से) आप आमतौर पर उत्सुक लाने के लिए इसे कॉन्फ़िगर नहीं करना चाहिए, जब तक आप कुछ मुद्दों का अनुभव नहीं करते हैं। जैसे:

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

विशाल डेटाबेस से निपटने के दौरान उत्सुक fetching काफी खतरनाक हो सकता है। इस तरह की एक डोमेन वर्ग की कल्पना कीजिए:

// really bad example 
class TreeNode { 

    String name    

    TreeNode parent 

    static hasMany = [ childNodes: TreeNode ] 

    static mapping {  
     parent lazy: false 
     childNodes lazy: false 
    } 

} 

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

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