فيما يتعلق بمشكلة السبات التي واجهها زملائي أمس. هذا هو الشيء الأساسي في السبات. أدرك أن العديد من الأشخاص قد واجهوا هذه المشكلة وأنها شائعة جدًا، لكنهم غالبًا ما يصابون بالحيرة عند مواجهتها.
من أجل تعميق الانطباع، تعرف على ما هو ولماذا هو كذلك.
بعد ذلك، استخدمت ببساطة إطار عمل Hibernate الأصلي لإجراء بعض التحقق، وفتحت وحدة تحكم طباعة SQL الخاصة بالتنفيذ، وتوصلت إلى الاستنتاج:
الفرضية هي أنه في منتصف نفس المعاملة:
1. استخدم عبارة sql، session.createSQLQuery(sql).executeUpdate(); للإدراج، وستقوم محطة الإخراج بطباعة بيان إدراج SQL، ثم استخدم عبارة SQL لتنفيذ session.createSQLQuery(sql).uniqueResult() ؛ وسيتم أيضًا طباعة استعلام SQL، ولا توجد مشكلة ويمكن الاستعلام عن البيانات.
2. استخدم السبات لتغليف العملية واستخدم session.save(entity); كما أنه لا يطبع عبارة استعلام SQL، ولكن يمكن الاستعلام عن البيانات. عند تنفيذ بيان التزام المعاملة، تتم طباعة عبارة SQL المدرجة
3. استخدم جلسة السبات (entity)؛ للإدراج، ثم استخدم عبارة "HQL" للاستعلام. التأثير هو نفس النقطة الثانية أعلاه.
4. استخدم جلسة عمل السبات (الكيان) للإدراج، لكن وحدة التحكم في الإخراج لا تطبع عبارة SQL المدرجة. ثم استخدم عبارة SQL لتنفيذ session.createSQLQuery(sql).uniqueResult(); وسيتم طباعة عبارة استعلام SQL. حدثت مشكلة، لا يمكن الاستعلام عن أية بيانات. في هذه الحالة، استخدم طريقة session.flush()، وقم بتنفيذ طريقة Flush() قبل الاستعلام، وستقوم وحدة التحكم في الإخراج بطباعة عبارة SQL المدرجة. إذا قمت بالاستعلام مرة أخرى، سيكون لديك البيانات.
بعد التحقق من المعلومات أعلاه، ظهرت النقطة الرابعة بشكل متكرر أثناء عملية التطوير، وأعتقد أن الكثير من الناس قد واجهوها، لكن الكثير من الناس ما زالوا في حيرة من أمرهم. هذا فقط عمّق الانطباع.
من وحدة تحكم الطباعة SQL، يمكننا رؤية عملية تشغيل طريقة حفظ السبات الأساسية:
1. تحديد ما إذا كان المثيل المراد حفظه في حالة مستمرة بالفعل، وإذا لم يكن كذلك، ضعه في ذاكرة التخزين المؤقت؛
2. قم بتخطيط عبارة SQL المدرجة بناءً على المثيل الذي سيتم حفظه. لاحظ أنه تم التخطيط له فقط ولم يتم تنفيذه.
3. يتم تنفيذ عبارة الإدراج المخطط لها مسبقًا عند تنفيذ المعاملة؛
استبدل tx.commit() بـ session.flush في هذا الوقت، يقوم عنصر التحكم بطباعة بيان الإدراج، ولكن لا تتم إضافة سجلات جديدة إلى قاعدة البيانات؛
تتمثل الوظيفة الرئيسية لطريقة التدفق في تنظيف ذاكرة التخزين المؤقت وإجبار قاعدة البيانات على المزامنة مع ذاكرة التخزين المؤقت للإسبات لضمان اتساق البيانات. الإجراء الرئيسي الخاص به هو إرسال سلسلة من عبارات SQL إلى قاعدة البيانات وتنفيذ عبارات SQL هذه، لكنه لن يرسلها إلى قاعدة البيانات. ستقوم طريقة الالتزام أولاً باستدعاء طريقة التدفق ثم تنفيذ المعاملة. هذا هو السبب في عدم إدراج السجل في قاعدة البيانات عند استدعاء التدفق، لأن التحديثات إلى قاعدة البيانات لن يتم حفظها حتى يتم تنفيذ المعاملة. نظرًا لأن أسلوب الالتزام يستدعي التدفق ضمنيًا، فإننا عمومًا لا نستدعي أسلوب التدفق بشكل صريح.
هذه هي آلية تدفق السبات. في عملية تحديث وحفظ بعض الكائنات المعقدة، من الضروري مراعاة ما إذا كانت التغييرات في ترتيب عمليات قاعدة البيانات وما إذا كانت عمليات التدفق المتأخرة لها تأثير على نتائج البرنامج. إذا كان هناك تأثير بالفعل، فيمكنك إضافة تدفق حيث تحتاج إلى الحفاظ على ترتيب العمليات لإجبار السبات على تدفق العمليات المسجلة في ذاكرة التخزين المؤقت إلى قاعدة البيانات. قد لا يبدو هذا جميلًا، ولكنه فعال للغاية.
سؤال: تم وضع طريقة session.save في ذاكرة التخزين المؤقت ولا يمكن اكتشافها بواسطة SQL التي تستفسر مباشرة عن قاعدة البيانات.
بعد استخدام طريقة Flush()، ستتم طباعة SQL الذي تم تنفيذه، لكنه لا يزال غير موجود في قاعدة البيانات. يمكن لاستعلام SQL المباشر العثور على البيانات.
1. أين يتم تخزين بيانات الكيان بعد التدفق ()؟ ذاكرة التخزين المؤقت هي نفس طريقة الحفظ () لذا يجب ألا تتمكن SQL من الحصول عليها.
2. بما أن البيانات لم تدخل قاعدة البيانات بعد طريقة التدفق، فيمكن الاستعلام عن SQL مباشرة باستخدام session.createSQLQuery(sql) للاستعلام، ويجب التحقق مباشرة من أنها ليست قاعدة البيانات.