سؤال

أنا أستخدم JBOSS 5.1.0 GA مع السبات وأحاول الآن تمكين ذاكرة التخزين المؤقت من المستوى الثاني. لقد أضفت الخصائص التالية إلى تكوين السبات الخاص بي.

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.jbc2.query.localonly" value="true"/>
<property name="hibernate.cache.region_prefix" value="my_prefix" />

ولقد قمت بشرح الكيانات التي أتوقع تغييرها بشكل غير منتظم مع ما يلي:

@Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)

هذا يعتمد على فهمي لـ توثيق.

ينشر التطبيق بنجاح بدون رسائل مخيفة (مثل تحذير أو رسائل الخطأ في دفق السجل). لفترة قصيرة من الزمن ، أرى أن التخزين المؤقت يعمل (أنا أستخدم إحصائيات السبات لرؤية هذا) ، لكن بعد فترة قصيرة أحصل على آثار مكدس للنموذج (حتى عند تسجيل الدخول كمستخدم واحد بدون وصول عن بُعد على الإطلاق):

"حاولت المعاملة إنشاء MyClass من جديد. لقد تم إنشاؤه بالفعل منذ أن بدأت هذه الصفقة ، من خلال معاملة أخرى (ربما عن بعد). لدينا حدث إنشاء متزامن"

يتبعه تتبع مكدس عملاق يتتبع في النهاية إلى استعلام مسمى قمت به والذي يحتوي على النموذج التالي:

SELECT x FROM X WHERE x.deleted = false

الاستعلام المسماة ليس لديه تعليقات إضافية للتخزين المؤقت.

أي نصيحة حول كيفية حل هذه المشكلة ستكون موضع تقدير كبير.

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

المحلول

بعض الأسئلة أولاً:

  1. هل تم نشر هذا الاستثناء لتطبيقك؟ أعني ، هل أنت متأثر بهذا ، أم أنك مهتم فقط بالرسالة الموجودة في السجل؟
  2. هل جميع كياناتك مشروحًا باستراتيجية للمعاملات ، أم عدد قليل منها فقط؟
  3. هل يسترجع استعلامك الأشياء بفارغ الصبر لفئة أخرى؟

أود أن أقول إن أفضل شيء يمكنك القيام به الآن هو تمكين التصحيح (أو ربما حتى التتبع) لعمليات ذاكرة التخزين المؤقت: log4j.logger.org.hibernate.cache=debug سيخبرك هذا بالضبط بما تفعله السبات. أنا مشتبه فيه يحاول هذا السبات وضع كائن على ذاكرة التخزين المؤقت ، والقيام بذلك مرة أخرى بمجرد أن يرى نفس الكائن خلال الجلسة نفسها (ربما كجزء من شجرة كائن آخر). كانت هناك مشكلة في الطابع الزمني لذاكرة التخزين المؤقت للاستعلام منذ بعض الوقت ، وقد تحدث نفس المشكلة هنا. على سبيل المثال:

Object A#1
 -- Object B#1

Object A#2
 -- Object B#1

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

ملاحظة: كان من المفترض أن يتم نشر هذا كتعليق ، لكن هذا كان طويلاً جدًا لذلك.

نصائح أخرى

هل جربت cacheconcurrencystrategy.nonstrict_read_write؟ قرأت المستندات في كثير من الأحيان ولا أعرف بالضبط ما يجب اختياره ، ولكن يبدو أنه يعمل بشكل جيد لمشاريعي. أعتقد أن cacheconcurrencystrategy.transactional آمن أكثر من اللازم وتجنب أداء ذاكرة التخزين المؤقت في ظروف معينة.

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