一、緩存
緩存(Cache):計算機領域非常通用的概念。他介于應用程序和永久性數據存儲源(如硬盤上的文件或者數據庫)之間,其作用是降低應用程序直接讀寫硬盤(永久性數據存儲源)的頻率,從而提高應用的運行性能。緩存中的數據存儲源中數據的拷貝。緩存的物理介質通常是內存
二、二級緩存
1.hibernate提供緩存機制:一級緩存、二級緩存
a)一級緩存:session級別緩存,在一次請求中共享數據。
b)二級緩存:sessionFactory級別緩存,整個應用程序共享一個會話工廠,共享一個二級緩存。
2.SessionFactory的緩存兩部分:
a)內置緩存:使用一個Map,用于存放配置信息,預定義SQL語句等,提供給Hibernate框架自己使用,對外只讀的。不能操作。
b)外置緩存:使用另一個Map,用于存放用戶自定義數據。默認不開啟。外置緩存hibernate只提供規范(接口),需要第三方實現類。外置緩存有成為二級緩存。
三、緩存的應用場景
1.適合放入二級緩存中的數據:
a)很少被修改
b)經常被訪問
c)不是很重要的數據,允許出現偶爾的并發問題
2.不適合放入二級緩存中的數據:
a)經常被修改
財務數據,絕對不允許出現并發問題
四、二級緩存的供應商
1.EHCache:可作為進程(單機)范圍內的緩存,存放數據的物理介質可以是內存或硬盤,對Hibernate的查詢緩存提供了支持。
2.OpenSymphony `:可作為進程范圍內的緩存,存放數據的物理介質可以是內存或硬盤,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持
3.SwarmCache:可作為集群范圍內的緩存,但不支持Hibernate的查詢緩存
4.JBossCache:可作為集群范圍內的緩存,支持Hibernate的查詢緩存
五、如何使用ehcache
1.導入jar包:ehcache-1.5.0.jar/ commons-logging.jar/? backport-util-concurrent.jar
2.開啟二級緩存
3.確定二級緩存提供商
4.確定需要緩存內容
1>配置需要緩存的類
2>配置需要緩存的集合
5.配置ehcache自定義配置文件
更名為ehcache.xml,放到src目錄下
一切準備就緒,案例演示二級緩存的特點
@Test
/**
*查詢單個對象
*/
publicvoidtestCache(){
SessionFactoryfactory= HibernateUtils.getSessionFactory();
Sessionsession=factory.getCurrentSession();
session.beginTransaction();
//
Personp1= (Person)session.get(Person.class, 23);
Personp2= (Person)session.get(Person.class, 23);
//
session.getTransaction().commit();
//開啟一個新的session
Sessionsession2=factory.getCurrentSession();
System.out.println(session==session2);
session2.beginTransaction();
//如果二級緩存生效,此處將不會發送SQL語句
Personp3= (Person)session2.get(Person.class, 23);
session2.getTransaction().commit();
factory.close();
}
@Test
/**
*查詢集合
*/
publicvoidtestCache2(){
SessionFactoryfactory= HibernateUtils.getSessionFactory();
Sessionsession=factory.getCurrentSession();
session.beginTransaction();
//
Personp1= (Person)session.get(Person.class, 23);
Setphones=p1.getPhones();
for(Phonephone:phones){
System.out.println(phone);
}
//
session.getTransaction().commit();
//開啟一個新的session
Sessionsession2=factory.getCurrentSession();
System.out.println(session==session2);
session2.beginTransaction();
//如果二級緩存生效,此處將不會發送SQL語句
Personp3= (Person)session2.get(Person.class, 23);
Setphones2=p3.getPhones();
for(Phonephone:phones2){
System.out.println(phone);
}
session2.getTransaction().commit();
factory.close();
}
配置文件詳解
maxElementsInMemory=“10000”
//Cache中最多允許保存的數據對象的數量
external=“false”?//緩存中對象是否為永久的,如果是,超時設置將被忽略,對象從不過期
timeToIdleSeconds=“1000”? //緩存數據鈍化時間(設置對象在它過期之前的空閑時間,單位為秒)
timeToLiveSeconds=“1000” ?//緩存數據的生存時間(設置對象在它過期之前的生存時間)
overflowToDisk=“false”
/>??? //內存不足時,是否啟用磁盤緩存
memoryStoreEvictionPolicy="LRU"
//內存不足時數據對象的清除策略
ehcache中緩存的3種清空策略:
FIFO(first in first out):先進先出
LFU( Less
Frequently Used):一直以來最少被使用的。如上面所講,緩存的元素有一個hit屬性,hit值最小的將會被清出緩存。
LRU(Least Recently Used):最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。
查詢緩存
1.查詢緩存又稱為三級緩存
2.查詢緩存默認不使用。需要手動開啟
3.查詢緩存:將HQL語句與查詢結果進行綁定。通過HQL相同語句可以緩存內容。
a)默認情況Query對象只將查詢結果存放在一級和二級緩存,不從一級或二級緩存獲取。
b)查詢緩存就是讓Query可以從二級緩存獲得內容。
使用步驟
1.開啟二級緩存
2.在查詢query對象,設置緩存內容(注意:存放和查詢都需要設置)
true
@Test
/**
*查詢集合
*/
publicvoidtestQueryCache(){
SessionFactoryfactory= HibernateUtils.getSessionFactory();
Sessionsession=factory.getCurrentSession();
session.beginTransaction();
//
Queryquery=session.createQuery("from Person");
//設置使用查詢緩存
query.setCacheable(true);
query.list();
//
session.getTransaction().commit();
//開啟一個新的session
Sessionsession2=factory.getCurrentSession();
session2.beginTransaction();
Queryquery2=session2.createQuery("from Person");
query2.setCacheable(true);
query2.list();
session2.getTransaction().commit();
factory.close();
}
0.cn?E?,Vo?