Hibernate(十四)二級緩存

一舵匾、Hibernate 緩存

緩存(Cache): 計算機領域非常通用的概念湾盒。它介于應用程序和永久性數(shù)據(jù)存儲源(如硬盤上的文件或者數(shù)據(jù)庫)之間因妙,其作用是降低應用程序直接讀寫永久性數(shù)據(jù)存儲源的頻率,從而提高應用的運行性能骡澈。緩存中的數(shù)據(jù)是數(shù)據(jù)存儲源中數(shù)據(jù)的拷貝锅纺。緩存的物理介質(zhì)通常是內(nèi)存

Hibernate中提供了兩個級別的緩存:

(1)第一級別的緩存是 Session 級別的緩存,它是屬于事務范圍的緩存秧廉。這一級別的緩存由 hibernate 管理的

(2)第二級別的緩存是 SessionFactory 級別的緩存伞广,它是屬于進程范圍的緩存

二拣帽、SessionFactory 級別的緩存

SessionFactory 的緩存可以分為兩類:

(1)內(nèi)置緩存: Hibernate 自帶的, 不可卸載. 通常在 Hibernate 的初始化階段, Hibernate 會把映射元數(shù)據(jù)和預定義的 SQL 語句放到 SessionFactory 的緩存中, 映射元數(shù)據(jù)是映射文件中數(shù)據(jù)(.hbm.xml 文件中的數(shù)據(jù))的復制. 該內(nèi)置緩存是只讀的.

(2)外置緩存(二級緩存): 一個可配置的緩存插件. 在默認情況下, SessionFactory 不會啟用這個緩存插件. 外置緩存中的數(shù)據(jù)是數(shù)據(jù)庫數(shù)據(jù)的復制, 外置緩存的物理介質(zhì)可以是內(nèi)存或硬盤

三疼电、使用 Hibernate 的二級緩存

(1)適合放入二級緩存中的數(shù)據(jù):

很少被修改

不是很重要的數(shù)據(jù), 允許出現(xiàn)偶爾的并發(fā)問題

(2)不適合放入二級緩存中的數(shù)據(jù):

經(jīng)常被修改

財務數(shù)據(jù), 絕對不允許出現(xiàn)并發(fā)問題

與其他應用程序共享的數(shù)據(jù)

四嚼锄、二級緩存的并發(fā)訪問策略

兩個并發(fā)的事務同時訪問持久層的緩存的相同數(shù)據(jù)時, 也有可能出現(xiàn)各類并發(fā)問題.

二級緩存可以設定以下 4 種類型的并發(fā)訪問策略, 每一種訪問策略對應一種事務隔離級別

非嚴格讀寫(Nonstrict-read-write):不保證緩存與數(shù)據(jù)庫中數(shù)據(jù)的一致性. 提供 Read Uncommited 事務隔離級別, 對于極少被修改, 而且允許臟讀的數(shù)據(jù), 可以采用這種策略

讀寫型(Read-write):提供 Read Commited 數(shù)據(jù)隔離級別.對于經(jīng)常讀但是很少被修改的數(shù)據(jù), 可以采用這種隔離類型, 因為它可以防止臟讀

事務型(Transactional):僅在受管理環(huán)境下適用. 它提供了 Repeatable Read 事務隔離級別. 對于經(jīng)常讀但是很少被修改的數(shù)據(jù), 可以采用這種隔離類型, 因為它可以防止臟讀和不可重復讀

只讀型(Read-Only):提供 Serializable 數(shù)據(jù)隔離級別, 對于從來不會被修改的數(shù)據(jù), 可以采用這種訪問策略

五、管理 Hibernate 的二級緩存

Hibernate 的二級緩存是進程或集群范圍內(nèi)的緩存

二級緩存是可配置的插件, Hibernate 允許選用以下類型的緩存插件:

(1)EHCache:可作為進程范圍內(nèi)的緩存, 存放數(shù)據(jù)的物理介質(zhì)可以使內(nèi)存或硬盤, 對 Hibernate 的查詢緩存提供了支持

(2)OpenSymphony OSCache:可作為進程范圍內(nèi)的緩存, 存放數(shù)據(jù)的物理介質(zhì)可以使內(nèi)存或硬盤, 提供了豐富的緩存數(shù)據(jù)過期策略, 對 Hibernate 的查詢緩存提供了支持

(3)SwarmCache:可作為集群范圍內(nèi)的緩存, 但不支持 Hibernate 的查詢緩存

(4)JBossCache:可作為集群范圍內(nèi)的緩存, 支持 Hibernate 的查詢緩存

4 種緩存插件支持的并發(fā)訪問策略(x 代表支持, 空白代表不支持)

六蔽豺、案例

(1)沒有二級緩存的時候????

(2)加入二級緩存插件的Jar包和配置文件

(3)配置hibernate.cfg.xml

(4)然后重新執(zhí)行区丑,只查詢一次而已,說明二級緩存配置成功

(5)實際上也可以在.hbm.xml文件中配置對哪些類使用二級緩存修陡,及二級緩存的策略是什么

得到的效果一樣

(6)查詢集合的時候

(7)把在.hbm.xml文件中配置使用二級緩存的配置去掉沧侥,統(tǒng)一在hibernate.cfg.xml上配置

這就是集合二級緩存,之前的屬于類的二級緩存

其實一樣也可以在.hbm.xml文件中配置使用二級緩存魄鸦,類的二級緩存和集合二級緩存都行? ??

注意:還需要配置集合中的元素對應的持久化類也使用二級緩存宴杀,否則將會多出n條SQL語句!

七拾因、ehcache.xml

<diskStore>:指定一個目錄旺罢,當 EHCache 把數(shù)據(jù)寫到硬盤上時,將把數(shù)據(jù)寫到這個目錄下绢记;

<defaultCache>:設置緩存的默認數(shù)據(jù)過期策略扁达;

<cache>:設定具體的命名緩存的數(shù)據(jù)過期策略,每個命名緩存代表一個緩存區(qū)域蠢熄;

緩存區(qū)域(region):一個具有名稱的緩存塊跪解,可以給每一個緩存塊設置不同的緩存策略。如果沒有設置任何的緩存區(qū)域签孔,則所有被緩存的對象叉讥,都將使用默認的緩存策略。即:<defaultCache.../>

Hibernate在不同的緩存區(qū)域保存不同的類/集合:

(1)對于類而言饥追,區(qū)域的名稱是類名图仓。如:com.atguigu.domain.Customer

(2)對于集合而言,區(qū)域的名稱是類名加屬性名判耕。如com.atguigu.domain.Customer.orders

cache 元素的屬性 :

name:設置緩存的名字,它的取值為類的全限定名或類的集合的名字

maxInMemory:設置基于內(nèi)存的緩存中可存放的對象最大數(shù)目

eternal:設置對象是否為永久的,true表示永不過期,此時將忽略timeToIdleSeconds 和 timeToLiveSeconds屬性; 默認值是false

timeToIdleSeconds:設置對象空閑最長時間,以秒為單位, 超過這個時間,對象過期透绩。當對象過期時,EHCache會把它從緩存中清除。如果此值為0,表示對象可以無限期地處于空閑狀態(tài)壁熄。

timeToLiveSeconds:設置對象生存最長時間,超過這個時間,對象過期帚豪。?如果此值為0,表示對象可以無限期地存在于緩存中. 該屬性值必須大于或等于 timeToIdleSeconds 屬性值

overflowToDisk:設置基于內(nèi)存的緩存中的對象數(shù)目達到上限后,是否把溢出的對象寫到基于硬盤的緩存中

八、查詢緩存

(1)對于經(jīng)常使用的查詢語句, 如果啟用了查詢緩存, 當?shù)谝淮螆?zhí)行查詢語句時, Hibernate 會把查詢結果存放在查詢緩存中. 以后再次執(zhí)行該查詢語句時, 只需從緩存中獲得查詢結果, 從而提高查詢性能

(2)查詢緩存使用于如下場合:

應用程序運行時經(jīng)常使用查詢語句

很少對與查詢語句檢索到的數(shù)據(jù)進行插入, 刪除和更新操作

(3)啟用查詢緩存的步驟:

配置二級緩存, 因為查詢緩存依賴于二級緩存

在 hibernate 配置文件中啟用查詢緩存

對于希望啟用查詢緩存的查詢語句, 調(diào)用 Query 的 setCacheable() 方法

測試一下:

(1)還沒有使用查詢緩存的情況

(2)在hibernate.cfg.xml配置使用查詢緩存草丧,在查詢方法調(diào)用 Query 的 setCacheable() 方法

九狸臣、時間戳緩存區(qū)域

時間戳緩存區(qū)域存放了對于查詢結果相關的表進行插入, 更新或刪除操作的時間戳. Hibernate 通過時間戳緩存區(qū)域來判斷被緩存的查詢結果是否過期, 其運行過程如下:

(1)T1 時刻執(zhí)行查詢操作, 把查詢結果存放在 QueryCache 區(qū)域, 記錄該區(qū)域的時間戳為 T1

(2)T2 時刻對查詢結果相關的表進行更新操作, Hibernate 把 T2 時刻存放在 UpdateTimestampCache 區(qū)域.

(3)T3 時刻執(zhí)行查詢結果前, 先比較 QueryCache 區(qū)域的時間戳和 UpdateTimestampCache 區(qū)域的時間戳, 若 T2 >T1, 那么就丟棄原先存放在 QueryCache 區(qū)域的查詢結果, 重新到數(shù)據(jù)庫中查詢數(shù)據(jù), 再把結果存放到 QueryCache 區(qū)域; 若 T2 < T1, 直接從 QueryCache 中獲得查詢結果

十、Query 接口的 iterate() 方法

Query 接口的 iterator() 方法

(1)同 list() 一樣也能執(zhí)行查詢操作

(2)list() 方法執(zhí)行的 SQL 語句包含實體類對應的數(shù)據(jù)表的所有字段

(3)Iterator() 方法執(zhí)行的SQL 語句中僅包含實體類對應的數(shù)據(jù)表的 ID 字段

(4)當遍歷訪問結果集時, 該方法先到 Session 緩存及二級緩存中查看是否存在特定 OID 的對象, 如果存在, 就直接返回該對象, 如果不存在該對象就通過相應的 SQL Select 語句到數(shù)據(jù)庫中加載特定的實體對象

大多數(shù)情況下, 應考慮使用 list() 方法執(zhí)行查詢操作. iterator() 方法僅在滿足以下條件的場合, 可以稍微提高查詢性能:

(1)要查詢的數(shù)據(jù)表中包含大量字段

(2)啟用了二級緩存昌执,且二級緩存中可能已經(jīng)包含了待查詢的對象

測試一下:

(1)使用list的情況

(2)使用iterate的情況

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烛亦,一起剝皮案震驚了整個濱河市诈泼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煤禽,老刑警劉巖铐达,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異檬果,居然都是意外死亡瓮孙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門选脊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杭抠,“玉大人,你說我怎么就攤上這事恳啥∑樱” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵钝的,是天一觀的道長翁垂。 經(jīng)常有香客問我,道長扁藕,這世上最難降的妖魔是什么沮峡? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮亿柑,結果婚禮上邢疙,老公的妹妹穿的比我還像新娘。我一直安慰自己望薄,他們只是感情好疟游,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痕支,像睡著了一般颁虐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卧须,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天另绩,我揣著相機與錄音,去河邊找鬼花嘶。 笑死笋籽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的椭员。 我是一名探鬼主播车海,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼隘击!你這毒婦竟也來了侍芝?” 一聲冷哼從身側響起研铆,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎州叠,沒想到半個月后棵红,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡留量,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年窄赋,在試婚紗的時候發(fā)現(xiàn)自己被綠了哟冬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楼熄。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浩峡,靈堂內(nèi)的尸體忽然破棺而出可岂,到底是詐尸還是另有隱情,我是刑警寧澤翰灾,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布缕粹,位于F島的核電站,受9級特大地震影響纸淮,放射性物質(zhì)發(fā)生泄漏平斩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一咽块、第九天 我趴在偏房一處隱蔽的房頂上張望绘面。 院中可真熱鬧,春花似錦侈沪、人聲如沸揭璃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘦馍。三九已至,卻和暖如春应役,著一層夾襖步出監(jiān)牢的瞬間情组,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工箩祥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留院崇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓滥比,卻偏偏與公主長得像亚脆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盲泛,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Hibernate是一個開放源代碼的對象關系映射框架濒持,它對JDBC進行了非常輕量級的對象封裝键耕,它將POJO與數(shù)據(jù)庫...
    蘭緣小妖閱讀 1,208評論 1 18
  • 1.JVM 堆內(nèi)存和非堆內(nèi)存 堆和非堆內(nèi)存按照官方的說法:“Java 虛擬機具有一個堆(Heap),堆是運行時數(shù)據(jù)...
    yanzhu728閱讀 915評論 0 0
  • Hibernate: 一個持久化框架 一個ORM框架 加載:根據(jù)特定的OID,把一個對象從數(shù)據(jù)庫加載到內(nèi)存中OID...
    JHMichael閱讀 1,973評論 0 27
  • 1. Java基礎部分 基礎部分的順序:基本語法柑营,類相關的語法屈雄,內(nèi)部類的語法,繼承相關的語法官套,異常的語法酒奶,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • 這是第一次嘗試點繪。沒有想象中那么復雜奶赔。惋嚎。。 自我感覺還不錯站刑。果然彩鉛是最耗費時間的……連我以為最麻煩的點繪另伍,也沒...
    悅離閱讀 303評論 0 1