سؤال

يستخدم الكلمة الأساسية "المتزامنة" على الأساليب الموجودة في Java Dao ستتسبب مشكلات عند استخدامها بواسطة تطبيق ويب؟

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

java.util.concurrent.ExecutionException: javax.persistence.PersistenceException: org.hibernate.HibernateException: Found shared references to a collection: com.replaced.orm.jpa.Entity.stuffCollection

ما أنا قلق بشأنه هو أنه عندما يحاول عدد كبير من الأشخاص واستخدام التطبيق بأن الأساليب المتزامنة ستحجب وإبطاء التطبيق بأكمله.

أنا أستخدم مصنع JPA Enterity Manager في Spring حقنه، الذي يوفر مدير كيان للمنظمة يمكنني إزالة طبقة DAO تقنيا وتناول الفصول الدراسية، اتصل بمصنع مدير الكيان مباشرة، لكنني أستمتع بالفصل الذي يوفره DAO.

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

في هذه الحالة يستخدم DAO سيفعل المزيد من الضرر ثم المساعدة؟


قطعة كبيرة من المعلومات التي تركتها من السؤال هي أن DAO ليس مينلاغيا. إذا كنت أفكر بشكل واضح بما فيه الكفاية ليشمل هذه التفاصيل، فربما لم أسأل عن السؤال في المقام الأول.

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

ومع ذلك، الآن لا أفهم لماذا أحصل على أخطاء عندما أزيل متزامنة.


وفقا لهذا مسلك, ، ينشئ annotation التضمين التلقائي لذلك يجب أن تكون قادرا على إنشاء سينجلتون داو.

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

المحلول

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

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

نصائح أخرى

إذا كان يحتاج إلى مزامنة لسلامة الخيط، فاتركها هناك. مطلوب حظر على أي حال في هذه الحالة. إذا كان الحظر غير مطلوب لحالة تطبيق الويب، فيمكنك إما:

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

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

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