السبات: batch_size؟ ذاكرة التخزين المؤقت المستوى الثاني؟

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

سؤال

لدي كائن مجال السبات الذي يتم تحميله بواسطة أجزاء مختلفة من التطبيق. في بعض الأحيان يكون من المفيد الحمولة كسول كل جمعية والبعض الآخر أفضل لتحميل الشيء بأكمله في إحدى الانضمام. كأمل حياة سعيدة غددت:

باستخدام دفعة جلب، يمكن أن يحمل السبات العديد من الوكلاء غير المهيمين إذا تم الوصول إلى وكيل واحد. جلب الدفعة هو تحسين لاستراتيجية جلب الخلاصة كسول.

hibernate.default_batch_fetch_size:

باستخدام دفعة جلب، يمكن أن يحمل السبات العديد من الوكلاء غير المهيمين إذا تم الوصول إلى وكيل واحد. جلب الدفعة هو تحسين لاستراتيجية جلب الخلاصة كسول.

أرى أيضا:

hibernate.jdbc.fetch_size:

تحدد قيمة غير صفرية حجم جلب JDBC (بيان المكالمات .SetFetchSize ()).

حسنا هو السبات الذكي بما يكفي للبحث في ذاكرة التخزين المؤقت على المستوى الثاني عند القيام بجلب الدفعة؟ أي القيام بإحضار واحد للحصول على المكالمة الأولية إلى الارتباط، ثم تضغط مكالمات X التالية ذاكرة التخزين المؤقت؟ وبهذه الطريقة يمكنني الحصول على التحميل الكسول الذي أرغب فيه ولكن أيضا ضرب ذاكرة التخزين المؤقت في كثير من الأحيان لمعاملات أكثر تشبه السائبة.

إذا كانت محتويات المجموعة بأكملها موجودة بالفعل في ذاكرة التخزين المؤقت، فهل لا تزال تنفذ استعلامات الجلب على الوصول إلى المجموعة؟

شكرا.

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

المحلول

لقد قمت بالكثير من الأبحاث اليوم وكان قادرا على حفر استجابة لسؤالي الخاص. كنت أبحث من خلال رمز السبات وتدفق يبدو وكأنه هذا:

هل تم تهيئة المجموعة؟

  • رقم؟ هل يتم وضع جلب الدفعة (العناصر التي تم الحصول عليها بواسطة جلب الدفعة في ذاكرة التخزين المؤقت)
  • نعم؟ ابحث في ذاكرة التخزين المؤقت عن عنصر معين، إذا لم يكن هناك يقوم بإحضار دفعة.

لذلك إذا تم العثور على العنصر في المجموعة التي تبحث عنها في ذاكرة التخزين المؤقت، فلن يحدث جلب الدفعة. إذا لم يتم العثور على العنصر في ذاكرة التخزين المؤقت على المستوى الثاني، فسيحدث جلب الدفعة، لكنه سيقوم بإجراء جلب من العناصر المركبة بغض النظر عن ما إذا كانت العناصر المركبة في ذاكرة التخزين المؤقت.


----- مثال 1 -----

الخير:

(ثلاثة عناصر في مجموعة - حجم الدفعة 3) أول الذهاب:

  • Collection.getitem (0) - لا ذاكرة التخزين المؤقت | دفعة جلب 3 البنود
  • Collection.getitem (1) - تحميلها بواسطة Batch-fetch
  • Collection.getitem (2) - تحميلها بواسطة Batch-fetch

الآن، في مكان آخر، في وقت لاحق في الوقت المناسب:

  • Collection.getitem (0) - مخبأ ضرب
  • Collection.getitem (1) - ضرب ذاكرة التخزين المؤقت
  • Collection.getitem (2) - ضرب ذاكرة التخزين المؤقت

----- مثال 2 -----

السيء:

(ثلاثة عناصر في مجموعة - حجم الدفعة 3)

في هذه الحالة، تمت إزالة العنصر عند الفهرس 0 من ذاكرة التخزين المؤقت لأنه ربما كان ذاكرة التخزين المؤقت ممتلئة وقد تم إسقاط العنصر، أو كان العنصر قد انتهى أو الخمول.

  • collection.getitem (0) - ليس في ذاكرة التخزين المؤقت حتى تفعل دفعة من 3 (حدد * أين هو المعرف (؟،؟،؟))
  • collection.getitem (1) - في ذاكرة التخزين المؤقت بالفعل (يحل محلها جلب الدفعات على أي حال)
  • collection.getitem (2) - في ذاكرة التخزين المؤقت بالفعل (يحل محلها جلب الدفعات على أي حال)

لذلك فإن المفاضلة هنا هي أنه سيكون لديك مكالمات SQL أقل بسبب الخلط، ولكن عليك أن تفتقدك ذاكرة التخزين المؤقت في كثير من الأحيان. هناك تذكرة مفتوحة لإلقاء نظرة الخلط في ذاكرة التخزين المؤقت على المستوى الثاني قبل أن تخرج إلى قاعدة البيانات.

http://opensource.atlassian.com/projects/hopernate/browse/hhh-1775.

التصويت عليه!

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