ذاكرة التخزين المؤقت للاستعلام من المستوى الثاني من السبات لا تعمل حريصًا

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

سؤال

في Nhibernate Profiler ، لاحظت أنه عندما أستخدم الجلب المتشوق على الارتباط ، باستخدام "Jack Join Fetch" في استعلام HQL أو .setfetchmode () في استعلام معايير لم يعد الاستعلام محددًا في ذاكرة التخزين المؤقت للاستعلام.

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

إذا كان ذلك يحدث أي فرق ، فأنا أستخدم memcached .... هل هناك خيار أفضل لذاكرة التخزين المؤقت L2 لنظام الاستعلام الكثيف؟

أجد هذا تحديًا إلى حد ما - إذا لم أستخدم الحمل المتحمس ، فأنا أعاني من مشكلة N+1 (ولكن يستخدم ذاكرة التخزين المؤقت) ، إذا قمت بحمل حريص ، أحصل على جميع الكيانات من قاعدة البيانات ، ولكن بدون تخزين مؤقت.

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

إذا كان بإمكان أي شخص أن يعطي أي نظرة ثاقبة حول مكان وجود "الخط السميك" ، فيجب أن يكون لدي أداء مثالي ، أو كيفية "جعل الخط أرق" ... سأكون بوابة للغاية وأضع علامة على الإجابة.

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

المحلول

تحديث: يرجى الاطلاع على سؤالي ذي الصلة هنا. خلاصة القول هي ، حاول استخدام FETCH = "SELECT" لتجنب الانضمام مع الكائنات الموجودة بالفعل في ذاكرة التخزين المؤقت للمستوى الثاني.


إجابتي السابقة (قد لا تزال مفيدة)

تخزين ذاكرة التخزين المؤقت للاستعلام مع المعرفات التي يتم إرجاعها من استعلامك ، وليس الكائنات الفعلية

لاستخدامه بشكل صحيح يجب عليك

  1. استخدم حاملي المكان (؟ أو: varname)
  2. تعيين ذاكرة التخزين المؤقت للاستعلام إلى True (لقد فعلت)
  3. يجب أن يعيد الاستعلام الكائنات ، وليس الخصائص (from Foo, ، ليس select foo.bar from Foo foo)
  4. يجب أن تكون الكائنات التي تم إرجاعها إما في ذاكرة التخزين المؤقت للمستوى الثاني ، أو أن المكالمات اللاحقة في نفس جلسة السبات (نفس المعاملة)

لتوضيح #4 ، إذا قامت معاملتان مختلفتان بتشغيل الاستعلام الدقيق (المخزنة مؤقتًا) مع المعلمات الدقيقة وإرجاع نفس الكائن بالضبط ، ولكنه ليس في ذاكرة التخزين المؤقت للمستوى الثاني ، فستظل قائمة قاعدة البيانات الحصول على الكائنات الفعلية (ربما اختيار .. في)

يعد عملية ذاكرة التخزين المؤقت للاستعلام مفيدة لأمرين - تجنب إعادة ضرب قاعدة البيانات في نفس المعاملة لاستعلامات HQL للعناصر غير المخزنة مؤقتًا ، والسماح باستخدام الكائنات المخزنة من المستوى الثاني لاستعلامات HQL (تستخدم تلقائيًا في الحمل أو الحصول على الأوامر)

أتمنى أن تطهير الغابة ...

نصائح أخرى

لا أعرف عن nhibernate ، ولكن في السبات ، يجب عليك تمكين التخزين المؤقت للاستعلام بشكل صريح لتلميحات استخدام الاستعلام. قد يقوم Cache L2 بتخزين الكائنات الفردية تلقائيًا ، ولكن بالنسبة للاستعلامات ، فإنه يتطلب توجيهات واضحة.

ليست حقًا إجابة - بل تلميح ... لا تخزن كل من تجميع وذاكرة التخزين المؤقت للاستعلام النتائج. انهم فقط تخزين معرفات الكيانات الناتجة. إنها ذاكرة التخزين المؤقت للكيان / الفئة هي التي من شأنها تخزين بيانات الكيان.

لذا ، التفكير في الأمر - إذا كان الاستعلام يرجع أنواع الكيانات المتعددة (أي الحمل المتحمس) ، فلا يمكن تخزين مجموعة من المعرفات بشكل معقول نظرًا لوجود علاقة بين الكيانات. أعتقد أن ذاكرة التخزين المؤقت نفسها هي بنية بسيطة للغاية.

لست متأكدًا من استفسارات "القيمة" - أي من شأنه أن يستخدم التوقعات بدلاً من الفصول. أود أن أقول أنك لا تستطيع تخزين هذه التخزين المؤقت. لكنني قد أكون مخطئا.

الآن على الرغم من أن هذا قد لا يساعدك في مشكلتك - فهناك تقنيات أخرى يمكن. وهي تحميل الدُفعات وذاكرة التخزين المؤقت للكيان. سأكون حذرا في تجميع ذاكرة التخزين المؤقت. لقد تعرضت للعض عدة مرات.

آمل أن يساعد ذلك (على الأقل قليلاً).

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