تحلل هذه المقالة بالتفصيل استخدام السبات لإدارة عمليات الجلسة والدفعات. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
السبات يدير الجلسة
يوفر السبات نفسه ثلاث طرق لإدارة كائنات الجلسة ① ترتبط دورة حياة كائن الجلسة بالخيط المحلي ② ترتبط دورة حياة كائن الجلسة بمعاملة JTA ③ يدير برنامج مندوب السبات دورة حياة كائن الجلسة
في ملف تكوين السبات، يتم استخدام سمة hibernate.current_session_context_class لتحديد طريقة إدارة الجلسة، وتتضمن القيم الاختيارية ما يلي:
① الموضوع: دورة حياة كائن الجلسة مرتبطة بالخيط المحلي ② jta*: دورة حياة كائن الجلسة مرتبطة بمعاملة JTA ③ مُدارة: برنامج مندوب السبات لإدارة دورة حياة كائن الجلسة
ترتبط دورة حياة كائن الجلسة بالخيط المحلي:
إذا تم تعيين قيمة السمة hibernate.current_session_context_class لملف تكوين Hibernate على مؤشر ترابط، فسيقوم Hibernate بإدارة الجلسة بطريقة مرتبطة بمؤشر الترابط المحلي.
يقوم السبات بربط الجلسة بالخيط المحلي وفقًا للقواعد التالية:
عندما يستدعي مؤشر ترابط (مؤشر ترابط) طريقة getCurrentSession () لكائن SessionFactory لأول مرة، ستقوم هذه الطريقة بإنشاء كائن جلسة (sessionA) جديد، وربط الكائن بـ ThreadA، وإرجاع الجلسة عندما يستدعي ThreadA كائن SessionFactory مرة أخرى عند استخدام طريقة getCurrentSession()، ستُرجع هذه الطريقة كائن الجلسة A. عندما يرسل ThreadA المعاملة المرتبطة بكائن الجلسة A، سيتم مسح السبات تلقائيًا قم بتخزين كائن sessionA مؤقتًا، ثم قم بإجراء المعاملة وأغلق الجلسة حسب الرغبة. عندما يلغي ThreadA المعاملة المرتبطة بكائن sessionA، سيتم أيضًا إغلاق كائن sessionA تلقائيًا إذا استدعى ThreadA طريقة getCurrentSession() لكائن SessionFactory مرة أخرى، فستقوم هذه الطريقة بإنشاء كائن جلسة (sessionB) جديد وربط الكائن به. ThreadA وجلسة العودة B
معالجة البيانات على دفعات
تشير المعالجة المجمعة للبيانات إلى معالجة كمية كبيرة من البيانات في معاملة واحدة وعمليات مجمعة في عملية طبقة التطبيق. الطرق الرئيسية هي كما يلي:
① خلال الجلسة
② تمرير HQL
③ من خلال جلسة عديمة الحالة
④ من خلال JDBC API ---- موصى به لأنه الأسرع
تنفذ الجلسة عمليات مجمعة:
ستقوم طرق الحفظ () والتحديث () الخاصة بالجلسة بتخزين الكائنات المعالجة في ذاكرة التخزين المؤقت الخاصة بها. إذا تم استخدام كائن الجلسة لمعالجة عدد كبير من الكائنات المستمرة، فيجب إفراغ الكائنات التي تمت معالجتها ولن يتم الوصول إليها مرة أخرى من ذاكرة التخزين المؤقت في الوقت المناسب. تتمثل الطريقة المحددة في استدعاء طريقة Flush () على الفور لتحديث ذاكرة التخزين المؤقت بعد معالجة كائن أو مجموعة صغيرة من الكائنات، ثم استدعاء طريقة Clear () لتخزين ذاكرة التخزين المؤقت.
تخضع عمليات المعالجة خلال الجلسة للقيود التالية:
يجب تعيين عدد معالجة الدفعات الفردية لـ JDBC في ملف تكوين السبات، ويجب التأكد من أن عدد دفعات عبارات SQL المرسلة إلى قاعدة البيانات في كل مرة يتوافق مع سمة حجم الدفعة.
إذا كان الكائن يستخدم منشئ معرف "الهوية"، فلا يمكن لـ Hibernate إجراء عمليات إدراج دفعة في JDBC.
عند إجراء عمليات مجمعة، يوصى بإيقاف تشغيل ذاكرة التخزين المؤقت من المستوى الثاني للإسبات
عرض التعليمات البرمجية لإدخال البيانات دفعة واحدة:
انسخ الكود ويكون الكود كالتالي: News news = null;
ل(int i = 0; i < 10000; i++) {
أخبار = أخبار جديدة ()؛
news.setTitle("--" + i);
session.save(news);
إذا((i + 1) % 20 == 0) {
session.flush();
جلسة عمل واضحة ()؛
}
}
التحديث الدفعي: عند إجراء التحديث الدفعي، من الواضح أنه ليس من المستحسن تحميل كافة الكائنات في ذاكرة التخزين المؤقت للجلسة مرة واحدة ثم تحديثها واحدًا تلو الآخر في ذاكرة التخزين المؤقت.
استخدم مجموعة النتائج القابلة للتمرير org.hibernate.ScrollableResults لا يحتوي هذا الكائن فعليًا على أي كائنات، فقط المؤشر المستخدم لتحديد موقع السجلات عبر الإنترنت. فقط عندما ينتقل البرنامج للوصول إلى عنصر معين من كائن ScrollableResults، فإنه سيتم تحميل الكائن المقابل في قاعدة البيانات.
يتم إرجاع الكائن org.hibernate.ScrollableResults بواسطة طريقة التمرير الخاصة بالاستعلام
العمليات المجمعة عبر HQL:
ملاحظة: تدعم HQL فقط عبارات الإدراج في شكل INSERT INTO...SELECT، ولكنها لا تدعم عبارات الإدراج في شكل INSERT INTO...VALUES. لذلك، لا يمكن تنفيذ عمليات إدراج الدُفعات باستخدام HQL
العمليات المجمعة من خلال StatelessSession:
رسميًا، استخدام StatelessSession مشابه لاستخدام Session. بالمقارنة مع الجلسة، تتميز StatelessSession بالاختلافات التالية:
لا تحتوي StatelessSession على ذاكرة تخزين مؤقت، وتكون الكائنات التي تم تحميلها أو حفظها أو تحديثها من خلال StatelessSession في حالة حرة.
لا يتفاعل StatelessSession مع ذاكرة التخزين المؤقت من المستوى الثاني لـ Hibernate. عند استدعاء أساليب save() أو update() أوdelete() الخاصة بـ StatelessSession، ستنفذ هذه الطرق على الفور عبارة SQL المقابلة بدلاً من التخطيط لتنفيذ عبارة SQL واحدة فقط.
لا تقوم StatelessSession بإجراء فحص قذر، لذلك بعد تعديل خصائص كائن العميل، تحتاج إلى استدعاء طريقة التحديث () الخاصة بـ StatelessSession لتحديث البيانات في قاعدة البيانات.
لن تقوم StatelessSession بإجراء أي عمليات متتالية على الكائنات المرتبطة. يتم تحميل كائن العميل ذو معرف الكائن 1 مرتين من خلال نفس كائن StatelessSession. تختلف عناوين الذاكرة الخاصة بالكائنين التي تم الحصول عليها.
يمكن التقاط العمليات التي يتم إجراؤها بواسطة StatelessSession بواسطة المعترض المعترض، ولكن سيتم تجاهلها بواسطة نظام معالجة الأحداث الخاص بـ Hibernate.
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.