hibernate緩衝按級別共分為兩種,一級緩衝(session)和二級緩衝(sessionfactory),有的也說是三種,還有一種是查詢緩衝,當然,查詢緩衝是依託於二級緩衝。
ok,什麼是緩衝?
在記憶體裡開闢一塊空間把本來應該存在硬碟裡面的資料,存在這個空間裡面,將來,需要這塊資料的時候直接在記憶體中獲取。這個就可以簡單理解為緩衝。
一級緩衝
什麼是一級緩衝,一級緩衝是hibernate預設的,不用管它。
比如下面這段**,12
3456
78910
11@test
publicvoid findtestyijihuanchong()
我們發現,只會發出一條sql語句,那麼這個就是hibernate自帶的一級緩衝。
那比如下面這種情況,新開的session呢?在系統中,多執行緒併發的時候,肯定不止產生乙個session,所以在優化效能時,一級緩衝往往滿足不了需求,那麼就有了二級緩衝
比如下面這段**,顯然發出的是兩條sql語句。12
3456
78910
1112
1314
1516
@test
publicvoidfindtestyijihuanchong()
二級緩衝
什麼是二級緩衝?二級緩衝也可以理解為sessionfactory級別的緩衝,sessionfactory是生產session的工廠,那麼我們可不可以這麼理解,session關聯乙個指向資料庫的結果集,那麼下次我在發sql的時候,我發現,sessionfactory裡面已經有了乙個指向這個結果集的語句,那麼我是不是可以直接使用了!
具體來說,二級緩衝並不是由hibernate來提供,是由第三方提供的緩衝外掛程式,通常有以下幾種第三方緩衝外掛程式:
ehcache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,對hibernate的查詢快取提供了支援。
oscache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,提供了豐富的快取資料過期策略,對hibernate的查詢快取提供了支援。
swarmcache:可作為群集範圍內的快取,但不支援hibernate的查詢快取。
jbosscache:可作為群集範圍內的快取,支援事務型併發訪問策略,對hibernate的查詢快取提供了支援。
那麼,哪些資料適合放在二級緩衝中,理解二級緩衝特性之後,我們知道,
1、經常被查詢的資料,這樣的資料需要頻繁訪問資料庫,肯定是非常適合放在緩衝
2、很少併發的資料,什麼意思呢?打個比方,乙個查詢,乙個修改,這樣很可能會造成一種髒讀,或者是幻讀。意思就是你的資料庫的資料可能被修改了,但是設定二級緩衝還沒有及時更新
3、重要的資料,這個不多說
總之,放在二級緩衝中的資料,一般都是不重要的,不經常修改的資料。比如說,選單,比如說許可權。這些都是非常適合放在二級緩衝中,比如說財務資料,工資資料等,這些不建議放在二級緩衝中
我們上面講了二級緩衝是第三方提供的那麼顯然我們需要配置,
首先我們需要在我們的hibernate.cfg.xml中開啟我們的二級緩衝,當然也可能是properties檔案中配置12
3456
<
property
name
=
"hibernate.cache.use_second_level_cache"
>true
<
property
name
=
"hibernate.cache.provider_class"
>org.hibernate.cache.ehcacheprovider
<
propertyname
=
"hibernate.cache.use_query_cache"
>true
第二步,我們指定是哪個實體類需要二級緩衝
annotations配置12
3@entity
@cache
(usage=cacheconcurrencystrategy.read_write)
@table
(name=
"p_person"
)
xml配置12
3<
class
name
=
"person"
table
=
"t_person"
>
<
cache
usage
=
"read-write"
/>
<
id
name
=
"id"
>
記住xml配置一定是id之前,class之內
還必須有ehcache.xml檔案,這個檔案有興趣大家可以在網上自己看一下,這裡我就不講解,裡面的內容了
配置完之後,我們直接看12
3456
78910
1112
1314
1516
@test
publicvoid findtesterjihuanchong()
這個時候,我們再看,肯定又是只傳送一條sql語句了。
查詢緩衝
什麼是查詢查詢緩衝。顧明思議它是查詢的時候產生的緩衝,那我們前面講到了二級緩衝,查詢緩衝和二級緩衝是什麼關係?首先查詢緩衝是依賴於二級緩衝的,查詢緩衝一般設定在list()方法中,查詢緩衝是重複查詢使用的緩衝,如果你兩個查詢不一樣,這個存在的緩衝是不起作用的。需要注意的是list()查詢緩衝必須要告訴hibernate,使用查詢緩衝,查詢緩衝才會生效。
setcacheable(true)
ok,看**12
3456
78910
1112
1314
@test
publicvoid findtestlist()
for
(person person:person1)
s.gettransaction().commit();
}
到這裡,我們基本上做完了hibernate緩衝,但是緩衝怎麼配置,怎麼使用,要根據實際的專案情況而定,並不是說,配置了二級緩衝一定會提高系統效能。同時,高階的可能也牽涉到緩衝演算法等問題。當然在專案中多犯幾次錯誤,自然就會使用hibenrate緩衝了!
下篇博文寫悲觀鎖和樂觀鎖,寫完之後,我會寫一篇怎麼模仿開發一套屬於我們自己orm框架,基本上就寫完了hibenrate的常見特性,閒來無事,喜歡寫著玩,大家隨便看,有問題及時**。
Hibernate一級,二級快取
一級快取 session級別的快取 當session被open時,快取即被open 當session被close時,快取即被close 在快取open到close這段時間,多次載入同乙個持久化物件,只有第一次向資料庫傳送sql語句載入,之後的載入都是基於快取的 而二級快取是sessionfactor...
hibernate的二級緩衝
二級緩衝 什麼是二級緩衝?二級緩衝也可以理解為sessionfactory級別的緩衝,sessionfactory是生產session的工廠,那麼我們可不可以這麼理解,session關聯乙個指向資料庫的結果集,那麼下次我在發sql的時候,我發現,sessionfactory裡面已經有了乙個指向這個結...
hibernate 一級快取 二級快取
1.什麼事快取?指為了降低應用程式對物理資料來源 mysql 訪問數次。從而提高應用程式的執行效能 2.為什麼需要快取?orm框架 去訪問資料庫的速度,直接影響到程式的執行速度。所以優化orm訪問效率比較重要。hibernate的快取是提公升和優化hibernate訪問效率。3.快取工作原理?4.一...