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?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容