1、爲什麼要用緩存?
Hibernate是一個持久層框架,經常訪問物理數據庫。爲了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。緩存內的數據是對物理數據源中的數據的複製,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
2、緩存原理?
Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存。
1)Hibernate一級緩存又稱爲“Session的緩存”。Session內置不能被卸載,Session的緩存是事務範圍的緩存。一級緩存是緩存實體對象的
2)Hibernate二級緩存又稱爲“SessionFactory的緩存”或者進程級的緩存。二級緩存可以被所有的session共享,二級緩存的生命週期和SessionFactory的生命週期一致,SessionFactory可以管理二級緩存,但有可能出現併發問題,因此需要採用適當的併發訪問策略,該策略爲被緩存的數據提供了事務隔離級別。二級緩存主要是緩存實體對象的
3) 什麼樣的數據適合存放到第二級緩存中?
1) 很少被修改的數據
2) 不是很重要的數據,允許出現偶爾併發的數據
3) 不會被併發訪問的數據
4) 常量數據
4)不適合存放到第二級緩存的數據?
1) 經常被修改的數據
2) 絕對不允許出現併發訪問的數據,如財務數據,絕對不允許出現併發
3) 與其他應用共享的數據。
3、緩存的應用
1)一級緩存
/**
* 在同一個session中,發出兩次load查詢
*/
public void testLoad1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Student student=(Student)session.load(Student.class, 1);
System.out.println(student.getName());
//不會發出查詢語句,load使用緩存
student=(Student)session.load(Student.class, 1);
System.out.println(student.getName());
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
2)二級緩存的配置
1)將ehcache.xml文件拷貝到src下
2)在hibernate.cfg.xml文件中加入緩存產品提供商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
3)啓用二級緩存,這也是它的默認配置
<property name="hibernate.cache.use_second_level_cache">true</property>
4)指定哪些實體類使用二級緩存
可以在映射文件中採用<cache>標籤中指定或在hibernate.cfg.xml文件中統一指定
注意使用的策略,通常使用read-only和read-write
<!-- 配置使用二級緩存的類 -->
<class-cache usage="read-only" class="com.tgb.hibernate.Student"/>
5)緩存原則:通常讀遠遠大於寫的數據進行緩存
6)注意大批量數據更新時,如果配置了二級緩存,建議禁用一級緩存和二級緩存的交互
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//從二級緩存中清除id爲1的Student對象
sessionFactory.evict(Student.class, new Integer(1));
//禁止將一級緩存中的數據放到二級緩存中
session.setCacheMode(CacheMode.IGNORE);
Student student=(Student)session.load(Student.class, 1);
System.out.println(student.getName());
//不會發出查詢語句,因爲配置了二級緩存,session可以共享二級緩存中的數據
//二級緩存是進程級的緩存
student=(Student)session.load(Student.class, 1);
System.out.println(student.getName());
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
總結:雖然緩存幫我們提高了性能問題,但是卻增加了維護的工作量,比如說我要進行增刪改操作的時候,還需要同時更新緩存,以保證數據的正確性。所以說在方面某一方面的時候必定會降低其他方面,沒有好與不好,合理利用就行。