سؤال

لدينا تطبيقان على الويب java كلاهما قراءة/الكتابة و 3 تطبيقات java المستقلة java/كتابة (واحد يحمل الأسئلة عبر البريد الإلكتروني ، واحد يعالج خلاصة xml ، يرسل واحد البريد الإلكتروني للمشتركين) جميع يستخدم السبات ومشاركة قاعدة رمز مشتركة.

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

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>

سؤال:

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
    return this.id;
}

نحن نستخدم MySQL راجع للشغل.

CREATE TABLE  `question` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`id`),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8

نحن لا نفتح وإغلاق الجلسات بشكل صريح ، بل ندع السبات يديرها عبر Util.getSessionFactory().getCurrentSession().

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

فهل تنفيذ نمط عرض مفتوح في تطبيقات الويب وإدارة الجلسات في التطبيقات المستقلة يبدو وكأنه سيصلح هذا؟

أو أي اقتراحات/أفكار أخرى من فضلك؟

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

المحلول 2

تبين أن هذه المشكلة لم تكن مرتبطة بالإسبات على الإطلاق.

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

بمجرد إزالة البيانات المراوغة ، كان كل شيء على ما يرام.

نصائح أخرى

نظرًا لأن جميع الأسئلة تحتوي على معرفات ، فإنني أفترض أن جميع الأسئلة يتم جلبها من قاعدة بيانات MySQL الخاصة بك.

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

استبدل مولد المعرف بتسلسل في قاعدة البيانات. (في نهاية المطاف المعرف كـ AutoNumber في MySQL). ثم تضمن قاعدة البيانات بدلاً من التطبيقات أن كل سؤال يحصل على معرف فريد.

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

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

نأمل أن تكون هذه المساعدة!

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