Hibernate--->緩存

一、緩存

緩存(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�

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章