Grails/Gorm Default Fetch Strategy: متى تقوم بتعيين FetchMode على "حريصة"؟ (حريصة مقابل كسول)
سؤال
ما هي بعض الإرشادات العامة حول متى يتم تعيين 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 ، فإنها ستقوم تلقائيًا بسحب جميع الحالات الأخرى من فئة المجال من قاعدة البيانات إلى ذاكرتك. عندما تكون هناك حالات كافية ، فمن المحتمل أن تقتلك التطبيق عن طريق جلب مثيل واحد فقط.