ذاكرة التخزين المؤقت السباتية
إن التخزين المؤقت هو كل شيء يتعلق بتحسين الأداء للتطبيق ويقع بين التطبيق وقاعدة البيانات لتجنب إمكانية الوصول إلى قاعدة البيانات المتعددة والسماح للتطبيقات المحددة للأداء بالأداء بشكل أفضل.
يعتبر التخزين المؤقت أمرًا مهمًا بالنسبة للإسبات ، ويعتمد مخططًا متعدد المستويات للتخزين المؤقت الموضح أدناه:
ذاكرة التخزين المؤقت المستوى 1:
ذاكرة التخزين المؤقت من المستوى الأول هي ذاكرة التخزين المؤقت للجلسة ، وهي ذاكرة التخزين المؤقت الإلزامية ، ويجب تمرير جميع الطلبات من خلالها. يتم تشغيل كائنات الجلسة باستمرار بواسطة كائنات قبل إرسالها إلى قاعدة البيانات.
إذا تم إصدار تحديثات متعددة ، فإن السبات يحاول تأخير التحديثات لأطول فترة ممكنة لتقليل عدد التحديثات التي تم إصدارها SQL. إذا أغلقت الجلسة ، فستفقد جميع الكائنات المخزنة مؤقتًا ، أو مستمرة ، أو تحديثها في قاعدة البيانات.
ذاكرة التخزين المؤقت المستوى 2:
يعد ذاكرة التخزين المؤقت من المستوى 2 اختياريًا وذاكرة التخزين المؤقت من المستوى 1 والتي سيتم البحث عنها دائمًا قبل أي محاولة للعثور على ذاكرة التخزين المؤقت من المستوى 2 لكائن. يمكن تكوين ذاكرة التخزين المؤقت من المستوى الثاني على أساس كل فئة وفرد ، ومسؤولية بشكل أساسي عن الكائنات المخزولة في الجلسة.
يمكن لأي ذاكرة التخزين المؤقت لجهة خارجية استخدام السبات. توفر واجهة org.hibernate.cache.cacheprovider ، ومن الضروري تنفيذ تنفيذ ذاكرة التخزين المؤقت للمقبض لتوفير السبات.
ذاكرة التخزين المؤقت مستوى الاستعلام:
يقوم Hibernate أيضًا بتنفيذ التكامل الضيق لذاكرة التخزين المؤقت لنتائج نتائج الاستعلام وذاكرة التخزين المؤقت المستوى 2.
هذه ميزة اختيارية تتطلب اثنين من ذاكرة التخزين المؤقت المادية الإضافية لحفظ نتائج الاستعلام المخزنة مؤقتًا والمناطق عند آخر تحديث جدول. هذا مفيد جدًا للاستعلامات التي غالباً ما يتم تشغيلها بنفس المعلمات.
ذاكرة التخزين المؤقت المستوى 2:
يستخدم Hibernate ذاكرة التخزين المؤقت من المستوى 1 ، افتراضيًا ، لا تفعل شيئًا مع ذاكرة التخزين المؤقت من المستوى 1. دعنا نذهب مباشرة إلى ذاكرة التخزين المؤقت من المستوى الثاني الاختياري. لا تستفيد جميع الفئات من التخزين المؤقت ، لذلك من المهم تعطيل ذاكرة التخزين المؤقت من المستوى 2.
يتم تعيين ذاكرة التخزين المؤقت المستوى 2 Hibernate على خطوتين. أولاً ، يجب أن تقرر استراتيجية التزامن لاستخدامها. بعد ذلك ، يمكنك تكوين انتهاء صلاحية ذاكرة التخزين المؤقت واستخدام ذاكرة التخزين المؤقت لتوفير سمات ذاكرة التخزين المؤقت الفعلية.
استراتيجية التزامن:
تعد سياسة التزامن وسيطًا مسؤولًا عن تخزين عناصر البيانات في ذاكرة التخزين المؤقت واستردادها من ذاكرة التخزين المؤقت. إذا كنت ترغب في تمكين التخزين المؤقت من المستوى 2 ، فسيتعين عليك تحديد سياسة التزامن ذاكرة التخزين المؤقت التي يجب استخدامها لكل فئة وجمع مستمر.
المعاملات: استخدام هذه الاستراتيجية لقراءة البيانات بشكل أساسي لمنع المعاملات المتزامنة للبيانات التي عفا عليها الزمن أمر بالغ الأهمية في حالات التحديثات النادرة.
القراءة والكتابة: مرة أخرى باستخدام هذه الاستراتيجية ، يعد القراءة الرئيسية للبيانات أمرًا بالغ الأهمية لمنع المعاملات المتزامنة من البيانات التي لا معنى لها في حالات نادرة من التحديثات.
Norrict-Read-Write: لا تضمن هذه الاستراتيجية الاتساق بين ذاكرة التخزين المؤقت وقاعدة البيانات. من خلال هذه الاستراتيجية ، لا يتمثل المفتاح في الانتباه إذا تم تغيير البيانات نادراً ما يتم تغيير إمكانية وجود بيانات قديمة.
القراءة فقط: سياسة التزامن مناسبة للبيانات ولن تتغير أبدًا. البيانات المستخدمة للرجوع إليها فقط.
إذا كنا نريد استخدام ذاكرة التخزين المؤقت من المستوى الثاني كصف للموظفين لدينا ، فلنضيف عناصر التعيين المطلوبة لإخبار السبات باستخدام سياسة ذاكرة التخزين المؤقت القابلة للقراءة والقابلة للكتابة لمثيلات الموظفين.
<؟ Table = "Employee"> <meta attribute = "class-description"> تحتوي هذه الفئة على تفاصيل الموظف. </meta> <cache useate = "read-write"/> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstName" column = "first_name" type = "string"/> <property name = "listname" column = "type =" type = propert </class> </hibernate mapping>
تخبر خاصية Usage = "Read-Write" Hibernate باستخدام ذاكرة التخزين المؤقت المحددة بواسطة سياسة التزامن القراءة والكتابة.
مزود ذاكرة التخزين المؤقت:
بعد النظر في سياسة التزامن في فصل مرشح ذاكرة التخزين المؤقت ، فإن الخطوة التالية هي تحديد مزود ذاكرة التخزين المؤقت. قوات السبات في اختيار ذاكرة التخزين المؤقت لخدمة التطبيق بأكمله.
ذاكرة التخزين المؤقت المقدمة في ملف تكوين hibernate.cfg.xml المحدد. حدد ehcache كموفر ذاكرة التخزين المؤقت من المستوى الثاني:
<؟ org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <!-افترض أن الطلاب هو اسم قاعدة البيانات-> name = "hibernate.connection.username"> الجذر </property> <property name = "hibernate.connection.password"> root123 </property> <property name = "hibernate.cache.provider_class"> org.cache.cache.ehcacheprovider </propert Resource = "exexectee.hbm.xml"/> </session-factory> </hibernate-configuration>
الآن ، تحتاج إلى تحديد خصائص منطقة ذاكرة التخزين المؤقت. لدى Ehcache ملف التكوين الخاص به ehcache.xml ، في التطبيق في classpath. في ehcache.xml ، قد يبدو تكوين ذاكرة التخزين المؤقت فئة الموظف هكذا:
<diskstore path = "java.io.tmpdir"/> <defaultCacheMaxElementSinMemory = "1000" eternal = "false" timetoidleSeconds = "120" name = "exempleee" maxElementSinMemory = "500" eternal = "true" timetoidleSeConds = "0"
هذا كل شيء ، تمكن الآن من ذاكرة التخزين المؤقت الثانوية في فئة الموظف والسباحة التي لديها الآن ذاكرة التخزين المؤقت الثانوية ، عندما يتصفح الموظف أو عندما يتم تحميل الموظف بواسطة معرف.
يجب عليك تحليل جميع فصولك وتحديد استراتيجية التخزين المؤقت المناسبة لكل فصل. في بعض الأحيان ، قد يؤدي ذاكرة التخزين المؤقت الثانوية إلى تدهور أداء التطبيق. لذلك يوصى بالتطبيق القياسي الذي لا يمكّن التخزين المؤقت لأول مرة ، وهو مناسب جدًا للتخزين المؤقت والتحقق من الأداء. إذا لم تحسن ذاكرة التخزين المؤقت أداء النظام ، فمن غير المعقول صنع أي نوع من ذاكرة التخزين المؤقت.
ذاكرة التخزين المؤقت مستوى الاستعلام:
باستخدام ذاكرة التخزين المؤقت للاستعلام ، يجب تنشيطه أولاً في ملف تكوين الخاصية hibernate.cache.use_query_cache = "true". إذا تم تعيين هذه الخاصية على TRUE ، فدع Hibernate إنشاء ذاكرة التخزين المؤقت المطلوبة في الذاكرة لحفظ مجموعة الاستعلام والمعرف.
بعد ذلك ، باستخدام ذاكرة التخزين المؤقت للاستعلام ، يمكنك استخدام طريقة setCachable (Boolean) لفئة الاستعلام. على سبيل المثال:
جلسة الجلسة = SessionFactory.OpenSession () ؛ استعلام الاستعلام = Session.Createquery ("من الموظف") ؛ Query.SetCachable (true) ؛ قائمة مستخدمي = Query.List () ؛ SessionFactory.Closesession () ؛يدعم Hibernate أيضًا دعم ذاكرة التخزين المؤقت ذات الحبيبات الدقيقة من خلال مفهوم منطقة ذاكرة التخزين المؤقت. ذاكرة التخزين المؤقت هي جزء من ذاكرة التخزين المؤقت المعطى اسم.
جلسة الجلسة = sessionfactory.opensession () ؛ استعلام الاستعلام = session.createquery ("من الموظف") ؛ Query.SetCachable (true) ؛ query.setCacheregion ("Employee") ؛ قائمة مستخدمي = Query.List () ؛ sessionfactory.closeessess () ؛يستخدم هذا الرمز طريقة لإخبار السبات لتخزين وإيجاد استعلامات على الموظفين في ذاكرة التخزين المؤقت.
السبات الأصلي SQL
يمكنك استخدام SQL الأصلي للتعبير عن استعلامات قاعدة البيانات. إذا كنت ترغب في استخدام وظائف خاصة بقاعدة البيانات ، مثل مطالبات الاستعلام أو توصيل الكلمات الرئيسية في Oracle. يسمح Hibernate3.x باستخدام عبارات SQL المكتوبة بخط اليد ، بما في ذلك الإجراءات المخزنة ، جميع عمليات الإنشاء ، التحديث ، الحذف والتحميل.
سيقوم التطبيق بإنشاء استعلام SQL الأصلي (على واجهة الجلسة) من الجلسة CreateQLquery () طريقة:
SQLquery العامة CreateSqlquery (سلسلة SQLString) يلقي HibernateException
عند تمرير استعلام SQL إلى طريقة CreateSqLquery () ، يمكنك استخدام طريقة الإضافات () المرتبطة بأي كيان سباتي حالي ، أو نتيجة قياسية باستخدام طريقة الإضافات () ، و addjoin () ، و addscalar ().
استعلام العددية:
الاستعلام الأساسي SQL هو الحصول على قائمة من القياس (القيم الرقمية) من واحد أو أكثر من الجدول. فيما يلي قيم بناء الجملة باستخدام أرقام SQL الأصلية:
String SQL = "SELECT First_Name ، Salary from Employee" ؛ sqlquery query = session.createsqlquery (sql) ؛ query.setResultTransformer (المعايير.
استعلام الكيان:
الاستعلامات المذكورة أعلاه جميع القيم العددية لإرجاع ، أي البيانات "المجردة" التي يتم إرجاعها من مجموعة النتائج. فيما يلي بناء الجملة للحصول على كائنات كيان ككل من استعلام SQL الأصلي من خلال طريقة الإضافات ().
String SQL = "SELECT * FROMEESE" ؛ sqlquery query = session.createsqlquery (SQL) ؛ Query.Addentity (emecister.class) ؛ قائمة النتائج = Query.List () ؛
اسمه SQL Query:
فيما يلي بناء الجملة للحصول على كائنات كيان من استعلامات SQL الأصلية واستخدام استعلامات SQL المسماة من خلال طريقة الإضافات ().
String SQL = "SELECT * من الموظف حيث id =: efferene_id" ؛ sqlquery query = session.createsqlquery (sql) ؛ query.addentity (emecualy.class) ؛ query.setParameter ("effectee_id" ، 10) ؛ query.list () ؛ مثال SQL الأصلي:
النظر في فئة Pojo التالية:
موظف الطبقة العامة {private int id ؛ سلسلة خاصة firstName ؛ سلسلة خاصة راتب الباحث الخاص ؛ الموظف العام () {} الموظف العام (سلسلة fname ، سلسلة lname ، int راتب) {this.firstName = fname ؛ this.lastname = lname ؛ هذا. } public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getFirstName () {return firstName ؛ } public void setFirstName (string first_name) {this.firstName = first_name ؛ } السلسلة العامة getLastName () {return lastName ؛ } public void setLastName (String last_name) {this.lastname = last_name ؛ } public int getSalary () {return salary ؛ } public void setSalary (int salary) {this.salary = salary ؛ }}دعنا ننشئ جدول الموظف التالي لتخزين كائن الموظف:
قم بإنشاء موظف الجدول (ID int not null auto_increment ، first_name varchar (20) الافتراضي ، last_name varchar (20) الافتراضي ، الراتب الافتراضي الفارغ ، المفتاح الأساسي (المعرف)) ؛
سيتم تعيين الملفات التالية.
<؟ Table = "Employee"> <meta attribute = "class-description"> تحتوي هذه الفئة على تفاصيل الموظف. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstName" column = "first_name" type = "string"/> <property name = "lastName" = "last_name" type = "string"/> <propert
أخيرًا ، سنقوم بإنشاء الطريقة الرئيسية () لفئة التطبيق لتشغيلها ، وسنستخدم تطبيقات استعلام SQL الأصلية:
استيراد java.util.*؛ استيراد org.hibernate.hibernateException ؛ استيراد org.hibernate.session ؛ استيراد org.hibernate.transaction ؛ استيراد org.hibernate.sessionfactory ؛ استيراد org.hibernate.sqlquery ؛ استيراد org.hibernate.criteria ؛ استيراد org.hibernate.hibernate ؛ استيراد org.hibernate.cfg.configation ؛ public static void main (string [] args) {try {factory = new configuration (). configure (). BuildSessionFactory () ؛ } catch (throwable ex) {system.err.println ("فشل في إنشاء كائن SessionFactory." + ex) ؛ رمي استثناء جديد initializererror (ex) ؛ } managementemive me = new ManagementEmployee () ؛ / * إضافة عدد قليل من سجلات الموظفين في قاعدة البيانات */ integer empid1 = me.addemplyee ("Zara" ، "ali" ، 2000) ؛ integer Empid2 = me.addemplyee ("daisy" ، "das" ، 5000) ؛ integer empid3 = me.addemplyee ("John" ، "Paul" ، 5000) ؛ integer empid4 = me.addemplyee ("mohd" ، "yasee" ، 3000) ؛ / * اذكر الموظفين وراتبهم باستخدام الاستعلام القياسي */ me.listemployeessCalar () ؛ / * اذكر معلومات الموظفين الكاملة باستخدام Quice Query */ me.listemployeSentity () ؛ } / * طريقة لإنشاء موظف في قاعدة البيانات * / public integer addemployee (سلسلة fname ، سلسلة lname ، int راتب) {جلسة الجلسة = factory.opensession () ؛ المعاملة tx = فارغة ؛ عدد صحيح الموظف = فارغ ؛ حاول {tx = session.begintransaction () ؛ الموظف الموظف = موظف جديد (fname ، lname ، الراتب) ؛ effereneiD = (عدد صحيح) الجلسة. save (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ } إرجاع الموظف ؛ } / * طريقة لقراءة جميع الموظفين الذين يستخدمون الاستعلام القياسي * / public void listemployeessCalar () {Session Session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ String SQL = "SELECT first_name ، راتب من الموظف" ؛ sqlquery query = session.createsqlquery (SQL) ؛ Query.SetResultTransformer (المعايير. alias_to_entity_map) ؛ قائمة البيانات = Query.List () ؛ لـ (كائن كائن: البيانات) {map row = (map) object ؛ System.out.print ("الاسم الأول:" + row.get ("first_name")) ؛ System.out.println ("، الراتب:" + row.get ("الراتب")) ؛ } tx.commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة لقراءة جميع الموظفين الذين يستخدمون Quice Query * / public void listeMployeSentity () {Session Session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ String SQL = "SELECT * FROM EMPLOSTE" ؛ sqlquery query = session.createsqlquery (SQL) ؛ Query.AddEntity (الموظف. class) ؛ قائمة الموظفين = Query.List () ؛ لـ (iterator iterator = amploy.iterator () ؛ iterator.hasnext () ؛) {efferene efference = (ameptory) iterator.next () ؛ system.out.print ("الاسم الأول:" + efferene.getFirstName ()) ؛ system.out.print ("الاسم الأخير:" + efferene.getLastName ()) ؛ System.out.println ("Salary:" + efferene.getSalary ()) ؛ } tx.commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }}} تجميع وتنفيذ:
فيما يلي الخطوات لتجميع وتشغيل التطبيق أعلاه. يرجى التأكد من تعيين المسار و classpath بشكل مناسب قبل التجميع والتنفيذ.
قم بتنفيذ ملف ManagementEmployee الثنائي لتشغيل البرنامج.
سيتم الحصول على النتائج التالية وسيتم إنشاء السجل في جدول الموظف.
$ Java ManagementEmployee
...... ستعرض رسائل السجل المختلفة هنا ......... الاسم الأول: Zara ، الراتب: 2000 First الاسم: Daisy ، الراتب: 5000First الاسم: John ، الراتب: 5000First الاسم: Mohd ، الراتب: 3000First Name: Gaal Last: Gaal Last: John Last: John Last: John Last: John Last: John. محمد الاسم الأخير: راتب ياسي: 3000
إذا قمت بفحص جدول الموظف ، فيجب أن يسجل أن يكون لها:
MySQL> حدد * من الموظف ؛
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------