مشخصات مقاله
-
1015
-
0.0
-
3323
-
0
-
0
درس 38 : آموزش Second Level Cache در Hibernate
آموزش Second Level Cache در Hibernate :
کش Second Level Cache Hibernate از یک کش اشتراکی Common Cache برای تمامی Session object های شی Session factory استفاده می کند. این کش در صورتی که چندین شی Session object از یک Session factory داشته باشید، بسیار کارآمد است. شی Session Factory اطلاعات second level را نگهداری می کند. این شی برای کلیه session object ها عمومی بوده و به صورت پیش فرض فعال نیست.
چندین برنامه مختلف می توانند قابلیت Second Level Cache را در برنامه فعال کنند :
- EH Cache.
- OS Cache.
- Swarm Cache.
- JBass Cache.
هر یک از اجراهای فوق (implementation)، کارکردهای مختلفی از قابلیت Cache را فراهم می کند. چهار راه برای استفاده از Second level Cache وجود دارد که عبارتند از :
- read-only : قابلیت Caching فقط برای عملیات خواندنی read-only فعال است.
- nonstrict-read-write : قابلیت Caching هم برای عملیات خواندن (read) و هم عملیات نوشتن (write) به کار می رود ولی در هر زمان فقط از یکی از عملیات ها می توان استفاده کرد.
- read-write : قابلیت Caching به صورت هم زمان هم برای عملیات خواندن (read) و هم برای عملیات نوشتن (write) به کار می رود.
- transactional : قابلیت Caching برای عملیات transaction فعال می شود.
خاصیت Cache-usage را می توان به هر کلاس class یا Collection level در فایل hbm.xml اضافه کرد. به صورت کد زیر :
جدول زیر نیز نحوه اجرای Second Level Cache و موارد استفاده Cache usage را نشان می دهد :
3 مرحله اضافی که بایستی برای اجرای Second level cache به وسیله EH cache انجام دهید، عبارتند از :
1)2 تنظیم زیر را در فایل Configuration برنامه، فایل hibernate.cfg.xml اضافه کنید.
org.hibernate.cache.EhCacheProvider true
2)تنظیمات مربوط به Cache usage را در فایل hbm اضافه کنید :
3)فایل ehcache.xml را به صورت زیر ایجاد و به پروژه اضافه کنید :
مثال عملی آموزش Second Level Cache در Hibernate.
برای اجرا و آموزش مثال second level cache در Hibernate ابتدا بایستی فایل های زیر را ایجاد و به پروژه اضافه کنید :
کد فایل Employee.java :
package com.javatpoint;
public class Employee {
private int id;
private String name;
private float salary;
public Employee() {}
public Employee(String name, float salary) {
super();
this.name = name;
this.salary = salary;
}
//setters and getters
}
کد فایل employee.hbm.xml :
در کد مثال فوق، ما از مدل read-only برای Cache only استفاده کرده ایم. Cache usage را نیز می توان در Collection استفاده کرد.
فایل hibernate.cfg.xml :
true update org.hibernate.dialect.Oracle9Dialect jdbc:oracle:thin:@localhost:1521:xe system oracle oracle.jdbc.driver.OracleDriver org.hibernate.cache.EhCacheProvider true
برای اجرای second level cache ، بایستی خاصیت Cache.provider_class را در فایل تنظیمات Configuration file اضافه کنیم.
فایل ehcache.xml
برای تعیین خاصیت Property بایستی فایل ehcache.xml را ایجاد کنید.
مقدار defaultCache برای کلیه کلاس های Persistent Class برنامه به کار می رود. شما می توانید Persistent Class را به صورت مستقیم توسط المنت Cache element نیز تعیین کنید.
در مورد خاصیت eternal باید اشاره کرد اگر مقدار خاصیت eternal=”true” قرار گیرد، دیگر نیازی نیست خواص timeToLiveSeconds و timeToIdleSeconds را تعیین کنیم زیرا به صورت اتوماتیک توسط hibernate مدیریت می شود.
تعیین خاصیت eternal=”false” کنترل کامل برنامه را به دست برنامه نویس داده ولی بایستی خواص TimetoLiveSeconds و timeToIdleSeconds را به صورت دستی تعیین کنیم.
خاصیت timeToIdleSeconds تعیین می کند هر شی یا object چند ثانیه می تواند در Cache به صورت Idle باشد.
همچنین خاصیت timeToLiveSeconds تعیین می کند که هر شی یا object چند ثانیه می تواند در حافظه Cache چه به صورت Idle یا Live حضور داشته باشد.
فایل FetchTest.java
package com.javatpoint;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class FetchTest {
public static void main(String[] args) {
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
SessionFactory factory=cfg.buildSessionFactory();
Session session1=factory.openSession();
Employee emp1=(Employee)session1.load(Employee.class,121);
System.out.println(emp1.getId()+" "+emp1.getName()+" "+emp1.getSalary());
session1.close();
Session session2=factory.openSession();
Employee emp2=(Employee)session2.load(Employee.class,121);
System.out.println(emp2.getId()+" "+emp2.getName()+" "+emp2.getSalary());
session2.close();
}
}
خروجی :
خروجی برنامه در نهایت به صورت زیر است :

همان طور که در خروجی فوق مشاهده می کنید، hibernate هر query را دو بار اجرا یا fire نکرده است. اگر از Second Level Cache استفاده نکنید، به دلیل این که هر query از session object های متفاوتی استفاده می کند، query برنامه دو بار اجرا می شود.