هناك منتجات شهيرة على الصفحة الرئيسية للمركز التجاري عبر الإنترنت ، وبالتالي فإن معدل النقر لهذه المنتجات مرتفع للغاية. عندما ينقر المستخدم على منتج شهير ، يحتاج إلى إدخال صفحة المعلومات التفصيلية للمنتج ، تمامًا مثل Taobao. ثم في كل مرة تنقر فيها ، يجب عليك الانتقال إلى الخلفية للاستعلام عن المعلومات التفصيلية للمنتج ، وسوف ترسل عبارة SQL المقابلة. في كل مرة تقوم فيها بتحديث الصفحة التفصيلية ، سترسل أيضًا عبارة SQL. وبهذه الطريقة ، سيتأثر الأداء بالتأكيد بشكل كبير. ثم باستخدام ذاكرة التخزين المؤقت الثانوية لـ Hibernate يمكن أن يحل هذه المشكلة.
قد يعتقد بعض الناس أنه يمكننا استخدام إعادة التوجيه. وبهذه الطريقة ، عندما يزور المستخدم لأول مرة ، يمكنهم معرفة المعلومات ووضعها في الجلسة. في المستقبل ، في كل مرة يتم فيها تحديث المستخدم ، يمكنهم الانتقال إلى الجلسة ، لذلك ليست هناك حاجة للاستعلام في قاعدة البيانات. هذا أمر منطقي ، لكنه لا يمكنه حل المشكلة أعلاه ، لأن ما نريد حله هو أن العديد من المستخدمين يصلون إلى نفس المنتج والنقر على نفس المنتج. يمكن لإعادة التوجيه فقط التأكد من أن نفس المستخدم ينقر أو ينحرف. لكن ذاكرة التخزين المؤقت الثانوية يمكن أن تحل هذه المشكلات.
دعنا أولاً نوضح تقنية التخزين المؤقت الثانوية بناءً على Hibernate4.3 بالتفصيل ، ثم قم بتكوين محدد لهذا المشروع.
1. Hibernate4.3 المستوى 2 ذاكرة التخزين المؤقت التكوين الأساسي
على عكس Hibernate3 ، فإن الحزمة الأساسية لـ Hibernate4.3 لا تحتوي على فئات ذات صلة ذاكرة التخزين المؤقت. إذا أردنا استخدام ذاكرة التخزين المؤقت الثانوية ، فنحن بحاجة إلى إضافة حزمة الجرة المخزنة مؤقتًا. من التنزيل الرسمي لـ Hibernate-RELEASE-4.3.11.Final ، هناك حزم جرة مطلوبة للذاكرة التخزين المؤقت الثانوية ، والتي يجب إضافتها إلى المشروع أولاً. على النحو التالي:
ثم نقوم بتكوين التكوين الثانوي المتعلق ذاكرة التخزين المؤقت في hibernate.cfg.xml:
<Hibernate-Configuration> <Session-Factory> <property name = "Dialect"> org.hibernate.dialect.mysqldialect </sprement> <property name = "show_sql"> true </propert name = "hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.ehcacheregionfactory < /property> <mapping /> <mapping /> <mapping /> <!- ما هي الفئات لتكوين التخزين المؤقت للدعم؟ يعرض هذا بشكل أساسي المنتجات الشهيرة على الصفحة الرئيسية ، لذلك يدعم فئة المنتج التخزين المؤقت-> <class class use = "read-on فقط"/> </session-factory> </hibernate-configuration>
ثم نفتح خادم Tomcat ، ثم نقوم بزيارة الصفحة الرئيسية ، وانقر على المنتجات الشهيرة ، ولا يتم إرسال أي عبارات SQL في الخلفية. قد تتساءل ، هل ذاكرة التخزين المؤقت من المستوى الثاني هذا بسيط؟ فقط تكوين هذين العنصرين؟ في الواقع ، فإن السبب في أن ذاكرة التخزين المؤقت من المستوى 2 قد ساري المفعول حتى الآن هو أنه يحتوي على تكوين افتراضي. يوجد ملف ehcache-failsafe.xml في ehcache-core-2.4.3.jar أعلاه ، والذي يحتوي بالفعل على تكوين افتراضي. سنقوم بتحليله بالتفصيل لاحقًا. دعونا أولاً نحلل استراتيجية الاستعلام عن Hibernate:
2. استراتيجية الاستعلام Hibernate4.3
يدعم Hibernate طريقتين للاستعلام: استعلام الجلسة واستعلام HQL.
هناك Session.Save () update () delete () get () load () وطرق أخرى في الجلسة. تعمل هذه الطريقة فقط في سجل واحد ، والافتراضي هو دعم ذاكرة التخزين المؤقت من المستوى 2 دون أي تكوين. لذلك: التكوين للقراءة فقط فعال للجلسة. إذا تم تكوين القراءة فقط في ذاكرة التخزين المؤقت الثانوية في الجلسة ، فسوف تفشل العمليات الجلسة. إذا كنت تريد النجاح ، فأنت بحاجة إلى تكوين القراءة. ولكن حفظ () و Get () load () ناجحة.
HQL: يتم استخدام هذه الطريقة لتشغيل سجلات متعددة بشكل افتراضي ، مثل LIST () و ExecuteUpdate () أساليب. هذه الطريقة الافتراضية لتكوين ذاكرة التخزين المؤقت الثانوية بما في ذلك القراءة فقط غير صالح. تقوم قائمة HQL () بإعداد سجلات متعددة ، ويكتشف مباشرة قاعدة البيانات ، ويسلم نتائج الاستعلام إلى ذاكرة التخزين المؤقت الثانوية ، مما يسهل استدعاء GET () و LOAD (). لا يدعم ExecuteUpdate التخزين المؤقت الثانوي ، ويتم تحديثه أيضًا مباشرة إلى قاعدة البيانات. سوف تضمن السبات أن قاعدة البيانات وذاكرة التخزين المؤقت متزامنة. ملاحظة: لا يحتوي HQL على طريقة Save (). إذا كنت بحاجة إلى إدراج البيانات ، فيمكنك فقط الاتصال بالطريقة Session.save ().
[ملاحظة]: تسمى ذاكرة التخزين المؤقت من المستوى الأول (موجودة بشكل افتراضي) في السبات أيضًا ذاكرة التخزين المؤقت على مستوى الجلسة ، ولا تستخدم لتحسين الأداء ، ولكن للتعامل مع المعاملات ؛ ذاكرة التخزين المؤقت من المستوى الثاني هي ذاكرة التخزين المؤقت SessionFactory ، وهي صالحة لجميع الجلسات ، ودورة حياتها هي نفسها SessionFactory (SessionFactory هي singleton وسيتم إنشاؤها عند بدء المشروع).
للحصول على استراتيجيات استعلام محددة ، دعونا نلقي نظرة على الصورة التالية:
【ملاحظة】: إذا كان نص الصورة صغيرًا جدًا ، فيمكنك سحب الصورة إلى نافذة جديدة لعرضها ~
ما سبق هو استراتيجية الاستعلام عن السبات. دعنا نستمر في النظر في تكوين ذاكرة التخزين المؤقت الثانوية.
3. الإسبات 4.3 المستوى 2 ذاكرة التخزين المؤقت التكوين المتقدم
كما ذكر أعلاه ، فإن السبب في أننا يمكننا استخدام ذاكرة التخزين المؤقت من المستوى 2 بعد تكوين عنصرين في hibernate.cfg.xml هو أن هناك تكوين افتراضي. دعنا نلقي نظرة على هذا التكوين الافتراضي أولاً:
<ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema- path = "java.io.tmpdir"/> <defaultCache maxElementSinMemory = "10000": <!-الحد الأقصى لعدد الكائنات التي تدعمها الذاكرة-> eternal = "false": <!-ما إذا كان الكائن صالحًا بشكل دائم ، ينصح أن يكون خطأ ، بحيث يكون المعلمان التاليان صالحين-> الوحدة هي ثواني. هذا هو ، إذا لم يكن أحد يستخدم هذا الكائن بعد 60 ثانية ، فسيتم تدميره مسبقًا-> timetoliveseconds = "120": <!-دورة حياة الكائن هي ثواني-> overflowtodisk = "true": <!-<! Disk-> MemoryStoreVictionPolicy = "LRU": <!-سياسة استبدال الكائن-> /> </hcache>
التفسير ذي الصلة حول التكوين الافتراضي موجود بالفعل في التعليقات أعلاه. نعلم الآن أنه بسبب هذا التكوين الافتراضي ، يمكن تنفيذ ذاكرة التخزين المؤقت من المستوى الثاني من Hibernate 4.3 بشكل صحيح. الآن إذا أردنا تكوين ذاكرة التخزين المؤقت بأنفسنا ، فنحن بحاجة إلى إنشاء ملف ehcache.xml جديد في دليل SRC ثم إعادة تكوين عناصر التكوين أعلاه. بعد ذلك ، نحتاج إلى اختبار كل تكوين. قبل الاختبار ، سأقوم بنشر الموقف المعروض على الصفحة الرئيسية وأصنع رقمًا. دعنا نشرح ذلك لاحقًا عند الاختبار:
ما سبق جزء من المحتوى المعروض على الصفحة الرئيسية. عثرت Hibernate على معلومات العرض من قاعدة البيانات وتم عرضها. سنرقيمها وسيكون من الأسهل تحليلها عندما نختبر ذاكرة التخزين المؤقت لاحقًا. لنبدأ في اختبار عناصر تكوين ذاكرة التخزين المؤقت أعلاه:
اختبار 1: اختبار عدد الكائنات في الذاكرة. تغيير التكوين إلى الموقف التالي:
<defaultCache maxElementSinMemory = "6" <!-الإعداد يدعم فقط 6 ذاكرة التخزين المؤقت-> eternal = "true" overflowtodisk = "false" memorystorevictionpolicy = "fifo": <!-first-in ، first-out-> />
بعد اكتمال التكوين ، نعيد تشغيل الخادم ونفتح الصفحة الرئيسية. نظرًا لوجود 6 تكوين ، يتم تخزين فقط آخر 6 سجلات موجودة في ذاكرة التخزين المؤقت ، أي رقم 3-8. نضغط على أي من المنتجات في 3-8 لإدخال صفحة تفاصيل المنتج. لاحظ أن وحدة التحكم في الخلفية لا تقوم بإخراج أي معلومات عن الاستعلام ، مما يعني أنه لا يتم إرسال بيان SQL. ومع ذلك ، عندما ننقر على المنتج رقم 2 ، يتم إرسال عبارة SQL في الخلفية ، أي أن قاعدة البيانات يتم الاستعلام عنها. لقد دعمنا ونقر على المنتج 2 مرة أخرى ، ولم يتم إرسال أي عبارة SQL ، مما يعني أنه تم وضعه في ذاكرة التخزين المؤقت ، لكن ذاكرة التخزين المؤقت تدعم 6 بيانات فقط. نظرًا لأن استراتيجية استبدال الكائنات التي تم تكوينها هي الأولى ، أولاً ، تمت إزالة الرقم 3 في ذاكرة التخزين المؤقت للتو. لقد نقرت 3 لمحاولة إرسال بيان SQL. لذلك اكتمل الاختبار ، وتنفيذ ذاكرة التخزين المؤقت من المستوى الثاني أمر طبيعي.
الاختبار 2: دورة حياة كائن الاختبار. تغيير التكوين إلى الموقف التالي:
<defaultCache maxElementSinMemory = "100" eternal = "false" <!-فقط عن طريق مطابقة كاذبة يمكن تعيين دورة الحياة التالية-> timetoidleSeconds = "20"
يتم تكوين وقت ذاكرة التخزين المؤقت على أنها 40 ثانية ، وإذا لم تكن هناك عملية في 20 ثانية ، فسيتم إزالتها. نظرًا لأننا قمنا بتعيين 100 سجل ، فإن الأرقام 1-8 أعلاه كلها في ذاكرة التخزين المؤقت. بعد تمكين الخادم ، نقر على أي واحد ، على سبيل المثال ، انقر فوق الرقم 8 ، ولا يتم إصدار أي عبارة SQL. عادة ، بعد 20 ثانية ، انقر فوق الرقم 8 وأرسل عبارة SQL ، مما يشير إلى أن دورة الحياة التي قمنا بتكوينها قد بدأت سريانها. لاحظ هنا أن التكوين لا يمكن أن يكون قصيرًا جدًا ، مثل 10 ثوانٍ ، لأن Tomcat سيستغرق عدة ثوانٍ للبدء. إذا كان هناك تكوين أقل ، فقد يكون الوقت قد انتهى قبل الاختبار ... فلن يعمل.
الاختبار 3: اختبار ما إذا كانت ذاكرة التخزين المؤقت الثانوية تدعم تخزين القرص الصلب.
<defaultCache maxElementSinMemory = "4" eternal = "false" <!-فقط عن طريق إعداد خطأ يمكن تعيين دورة الحياة التالية-> timetoidleSeconds = "100"
قمنا بتعيين دعم تخزين القرص الصلب إلى True وتكوين سعة التخزين القصوى للذاكرة التخزين المؤقت الثانوية إلى 4. أعد تشغيل الخادم. نظرًا لأن ذاكرة التخزين المؤقت الثانوية تخزن ما يصل إلى 4 سجلات ، يجب ترقيمها 5-8. لن يؤدي النقر على 5-8 بالتأكيد إلى إرسال عبارات SQL ، ولكن عندما ننقر على 1-4 ، لن نرسل عبارات SQL ، لأننا قمنا بإعداد دعم لتخزين القرص الصلب ، ستقوم السبات بتخزين نتائج الاستعلام على القرص الثابت ، حتى نتمكن أيضًا من الحصول على البيانات مباشرة دون إرسال بيانات SQL.
الاختبار 4: اختبر استراتيجية استبدال ذاكرة التخزين المؤقت المستوى 2
<defaultCache <!-تم القضاء على FIFO ولن يتم استخدامه مرة أخرى ... LRU: الخوارزمية التي تم الوصول إليها على الأقل في الآونة الأخيرة (سياسة الوقت) ، وسيتم تجاهل تردد الوصول ، وسيتم تجاهل التردد الذي تم الوصول إليه في وقت مضى (سيتم استبدال التردد). maxElementSinMemory = "3" eternal = "false" <!-فقط عندما يتم تكوينه كخاذج ، يمكن تعيين دورة الحياة التالية-> timetoidleSeConds = "100"
كما يوحي الاسم ، يركز LRU و LFU على آخر وقت وتردد الوصول على التوالي. لنأخذ LFU كمثال. الآن قمنا بتعيين الحد الأقصى للتخزين على 3 سجلات ، أي الرقم 6-8. الآن نصل إلى رقم 6 ثلاث مرات ، الرقم 7 مرتين ، الرقم 8 مرة واحدة ، ولن تصدر عبارات SQL. نصل إلى الرقم 7 مرة أخرى ونصدر عبارات SQL. الآن الرقم 7 في ذاكرة التخزين المؤقت ، تمت إزالة الرقم 8 لأنه يحتوي على أقل عدد من الوصول. يمكننا النقر على الرقم 8 مرة أخرى لاختباره ، وإصدار بيان SQL ، والاختبار ناجح. إذا كان LRU ، فإن الرقم 6 الذي تمت إزالته هو الرقم 6 لأن الرقم 6 هو الأقدم الذي يتم الوصول إليه.
في هذه المرحلة ، أعتقد أن الجميع قد أتقن استخدام ذاكرة التخزين المؤقت الثانوية ، وينتهي اختبار ذاكرة التخزين المؤقت الثانوية هنا. دعنا نقوم بتكوينات لمشروع المركز التجاري عبر الإنترنت.
4. التكوين الفعلي لمشاريع مراكز التسوق عبر الإنترنت
نقوم بتكوين الحد الأقصى لعدد السجلات في ذاكرة التخزين المؤقت الثانوية ليكون 1000 ، وضبط دورة الحياة على 120 ثانية ودورة الفاصل إلى 60 ثانية. نحن ندعم تخزين القرص الصلب ، ونستخدم استراتيجية استبدال أولوية التردد (LFU) ، لأنه إذا كان معدل النقر فوق المستخدم مرتفعًا ، فيجب وضعه في ذاكرة التخزين المؤقت الثانوية.
<ehcache xmlns: xsi = "http://www.w3.org/2001/xmlschema- <defaultCache maxElementSinMemory = "1000" eternal = "false" timetoidleSeConds = "60"
حسنًا ، بالاقتران مع مشروع المركز التجاري عبر الإنترنت ، يتم تقديم تكوين واستخدام ذاكرة التخزين المؤقت من المستوى الثاني من Hibernate 4.3.
العنوان الأصلي: http://blog.csdn.net/eson_15/article/details/51405911
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.