تصف هذه المقالة المبدأ وطريقة التنفيذ لتحميل تأخير السبات. شاركه للرجوع إليه ، على النحو التالي:
لمواصلة تحسين أداء السبات ، يمكنك استخدام:
تقنية تحميل الكمون ، وإدارة استراتيجيات تزحف البيانات ، وأداء إدارة ذاكرة التخزين المؤقت لتحسين أداء السبات.
1. تأخير تحميل (تحميل)
التحميل الكسول هو آلية توفرها السبات لتحسين كفاءة تنفيذ البرنامج ، أي أنه سيتم إنشاؤه فقط عند استخدام بيانات الكائن بالفعل.
عملية التحميل البطيئة: يتم تحقيق تحميل التأخير من خلال آلية الوكيل. عندما تحصل Hibernate على بيانات من كائن معين من قاعدة بيانات ، عند الحصول على قيمة سمة المجموعة لكائن ، أو عند الحصول على كائن آخر مرتبط بكائن ، نظرًا لعدم استخدام بيانات الكائن (باستثناء المعرف) ، فإن Hibernate لا يقوم بتحميل البيانات الحقيقية من قاعدة البيانات ، ولكن فقط إنشاء كائن بروكسي لتمثيل الكائن. جميع السمات على هذا الكائن هي القيم الافتراضية ؛ لا يتم إنشاء هذا الكائن الحقيقي إلا عندما تكون هناك حاجة حقًا لبيانات الكائن لاستخدامها ، ويتم تحميل بياناته فعليًا من قاعدة البيانات.
عندما يتم استدعاء طريقة load () في الجلسة لتحميل كيان ؛ عندما تقوم الجلسة بتحميل الكيان ، سيتم تحميل قيمة سمة المجموعة في الكيان مع تأخير التحميل ؛ عندما تقوم الجلسة بتحميل كيان ، كائن الكيان الآخر الذي يكون الكيان أحاديًا ، سيتم استخدام التحميل المتأخر لكائن كيان آخر مرتبط بالنهاية الواحدة
قم بإيقاف تشغيل التحميل كسول: عند تحميل كيان واحد ، يمكنك استخدام طريقة GET ().
بالنسبة لسمات التجميع في الكيانات ، يمكنك إضافة Attribute Lazy = "false" إلى هذه المجموعة (<stip> ، <cal> ، <list> ...). عندما يكون هناك ارتباط واحد من كائن كيان آخر ، يمكنك تكوين <-
2. يتم استخدام الأنواع الرئيسية من التحميل الكسول في السبات افتراضيًا:
• يتم استخدام التحميل الكسول عند استدعاء طريقة LOAD () في الجلسة لتحميل كيان.
• عندما تقوم الجلسة بتحميل كيان ، يتم تحميل قيم سمة المجموعة في هذا الكيان بالتأخير. (واحد إلى رجل)
• عندما تقوم الجلسة بتحميل كيان ، يتم تحميل كائن كيان آخر يتم تحميله منفردًا (واحد إلى واحد ، كثير إلى واحد) المرتبط بالكيان.
• الفرق بين الثاني والثالث هو: في الحالة الثانية ، تتمثل الطريقة لإلغاء تحميل التأخير في تعيين سمة التحميل البطيئة Lazy = "false" بعد تعيين علامة تعيين ملف رسم الخرائط الذي يحتوي على سمة SET ؛ في الحالة الثالثة ، فإن العلامة العديدة إلى واحدة في ملف رسم الخرائط للطرف المتعدد الذي يحتوي على العديد إلى واحد ، أي ، تم تعيين العلامة العديدة إلى واحدة.
الكائنات التي يمكن تحميلها كسول يتم إعادة كتابة كائنات الوكيل. عندما لا يتم إغلاق الجلسة المرتبطة بها ، فإن الوصول إلى خصائص هذه الكائنات المحملة البطيئة (الوكيل) (باستثناء getID و getClass) سوف تهيئة هذه الوكيل ، أو تستخدم hibernate.initialize (الوكيل) لتهيئة كائنات الوكيل ؛ عند إغلاق الجلسة المرتبطة ، سيحدث استثناء للوصول إلى الكائن المحمّل كسول.
3. استراتيجية الزحف (الجلب)
قم بتكوين "سياسة الزحف" للتأثير بشكل مباشر على تأثير الاستعلام لطرق GET () و LOAD () للجلسة.
استراتيجية الزحف على الارتباط الواحد <إلى واحد> <-to_one>:
يمكنك إضافة سمات الجلب إلى عناصر رسم الخرائط المرتبطة أحادية الطرف. حدد: تأخير التحميل ؛ انضم: استخدم الاتصال الداخلي في نفس عبارة SELECT للحصول على بيانات الكائن وبيانات الكائن المرتبط بها. في هذا الوقت ، يكون تحميل تأخير الكائن المرتبط غير صالح.
استراتيجية الزحف على خصائص التجميع :
حدد: تأخير التحميل ؛ انضم: استخدم Intra-incling في نفس بيان SELECT للحصول على مجموعة جمعية الطرف الآخر. في هذا الوقت ، سيكون الكسول على المجموعة المرتبطة غير صالح. Subselect: أرسل بيان استعلام آخر أو مساع فرعي للزحف. تعمل هذه الاستراتيجية أيضًا على استفسارات HQL.
4. تحليل حالة الحمل الكسول
الحالة 1: كيان واحد يستدعي طريقة load () لإلغاء التحميل الكسول
حزمة com.hbsi.test ؛ استيراد org.hibernate.session ؛ استيراد org.junit.test ؛ استيراد com.hbsi.domain.user ؛ استيراد com.hbsi.utils.hibernateutil ؛ publicclass testlazy HibernateUtil.getSession () ؛ مستخدم المستخدم = (المستخدم) الجلسة. هذا لأنه على الرغم من أنه في الحالة المدارة ، فإن هذا الكائن هو كائن له قيم السمات ولا يحذفه ، ولكنه يعزل فقط القناة للتعامل مع قاعدة البيانات. system.out.println (user.getName ()) ؛} // testload () method ؛ لا تقم بتنفيذ عبارة SQL ، وتنفيذ فقط testpublicvoid testload () {جلسة الجلسة = hibernateutil.getSession () ؛ مستخدم المستخدم = (المستخدم) session.load (user.class ، 1) ؛ // معرف الإخراج هنا لن ينفذ عبارة SQL. سوف تحصل مباشرة على المعرف من المعرف الذي مررت به أعلاه. لم يتم البحث في قاعدة البيانات ، وبالتالي فإن SQL بيان System.out.println (user.getId ()) ؛ // اسم الإخراج مختلف. في هذا الوقت ، يتم إنشاء كائن الوكيل بالفعل. هذا هو كائن الوكيل مع سمة الاسم. في هذا الوقت ، حتى لو قمت بإغلاق الجلسة ، فلا يزال بإمكانك الحصول على الاسم من خلال هذا الكائن. إذا قمت بتعليق هذه الجملة ، أي ، فإن كائن الوكيل لا يقوم بتسهيل كائن الوكيل ، ثم قم بتنفيذ سمة اسم الإخراج بعد إغلاق الجلسة ، سيتم الإبلاغ عن خطأ: لا يمكن تهيئة الوكيل // system.out.println (user.getName ()) ؛ hibernateutil.close ()الموقف 2: إلغاء التحميل كسول على المجموعة
اختبر ما إذا كان التحميل البطيء في سمة المجموعة قد تم تعيينه على خطأ في ملف التعيين ، وسيتم وضعه مع البيانات في جدول الطلبات ، أي بيانان محددان
testpublicvoid find () {Session Session = hibernateutil.getSession () ؛ custy cus = (customer) session.get (customer.class ، 3) ؛ system.out.println (cus.getCname ()) ؛ // استخدم الطريقة التالية لإخراج عبارات SQL لمدة يومين ، وهي مفصولة ؛ إذا تم استخدام التحميل البطيء ، فسيتم إخراج اثنين من بيانات SQL أولاً ، ونتيجة الإخراج هي // لا يمكن ربط الطريقة مباشرة هنا لإخراج cus.getord (). getOname () ؛ لأن cus.getord () تُرجع مجموعة مجموعة <Cresers> أوامر = cus.getord () ؛ system.err.println (orders.size ()) ؛ hibernateutil.close () ؛}الطريقة 3: <واحد إلى واحد> ، <كثير إلى واحد> إلغاء التحميل كسول
testpublicvoid find () {// بشكل افتراضي ، التحميل كسول ، أي إخراج واحد مع عبارة SQL ؛ إذا تم ضبط تحميل التأخير على كاذبة وإخراج بيانين SQL ، فسيتم العثور على معلومات العميل غير المرغوب فيها. جلسة الجلسة = hibernateutil.getSession () ؛ الطلبات Ord = (الطلبات) Session.get (orders.class ، 3) ؛ system.out.println (ord.getoname ()) ؛ hibernateutil.close () ؛}آمل أن يكون الوصف في هذه المقالة مفيدًا لبرمجة Java للجميع استنادًا إلى إطار السبات.