Grails/Gorm Default Fetch Strategy: متى تقوم بتعيين FetchMode على "حريصة"؟ (حريصة مقابل كسول)

StackOverflow https://stackoverflow.com/questions/654704

  •  19-08-2019
  •  | 
  •  

سؤال

ما هي بعض الإرشادات العامة حول متى يتم تعيين FetchMode على "حريصة" في فئة المجال؟ إيجابيات وسلبيات fetchmode "حريصة" مقابل الافتراضي "كسول"؟

يرجى تضمين بعض الأمثلة/حالات الاستخدام المحددة التي تظهر متى يجب استخدام "حريصة" (FetchMode = حريصة) ، وعندما لا تكون (FetchMode = Lazy).

هل كانت مفيدة؟

المحلول

يتمتع التحميل الكسول بشكل أساسي بمزيد من الفوائد من البديل المتحمس (الأداء ، واستخدام الموارد). نظرًا لأنه هو إعداد Grails الافتراضي لجميع العلاقات (نظرًا لأن Grails 1.1) ، يجب ألا تقوم عمومًا بتكوينه لجلب حريص ، إلا إذا واجهت مشكلات معينة. مثل:

  • مشاركة مثيل المجال يتراكم جلسات السبات المختلفة (على سبيل المثال ، عند وضع مثيل فئة المجال في نطاق جلسة HTTP والوصول إلى الخصائص منه - مثل المستخدم)
  • الحصول على lazyinitializationException عند الوصول إلى مثيلات فئة المجال في التخطيطات/المشاهدات
  • عندما تكون متأكدًا ، ستصل إلى خاصية علاقة معينة في كل مرة (أو معظم الوقت) عندما يتم جلب مثيل ، سيكون من المنطقي أيضًا تكوين هذه العلاقة لجلب حريصة.

يمكن أن يكون حريصة الجلب خطيرًا جدًا عند التعامل مع قواعد البيانات الضخمة. تخيل فئة المجال مثل هذا:

// really bad example
class TreeNode {

   String name            

   TreeNode parent

   static hasMany = [ childNodes: TreeNode ]

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

}

عندما تقرأ أي من مثيلات Treenode ، فإنها ستقوم تلقائيًا بسحب جميع الحالات الأخرى من فئة المجال من قاعدة البيانات إلى ذاكرتك. عندما تكون هناك حالات كافية ، فمن المحتمل أن تقتلك التطبيق عن طريق جلب مثيل واحد فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top