真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Hibernate緩存機(jī)制的原理

本篇內(nèi)容主要講解“Hibernate緩存機(jī)制的原理”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Hibernate緩存機(jī)制的原理”吧!

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、瀍河網(wǎng)絡(luò)推廣、微信小程序定制開發(fā)、瀍河網(wǎng)絡(luò)營(yíng)銷、瀍河企業(yè)策劃、瀍河品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供瀍河建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

1. 為什么要用 Hibernate 緩存?

   Hibernate是一個(gè)持久層框架,經(jīng)常訪問(wèn)物理數(shù)據(jù)庫(kù)。

   為了降低應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問(wèn)的頻次,從而提高應(yīng)用程序的運(yùn)行性能。

   緩存內(nèi)的數(shù)據(jù)是對(duì)物理數(shù)據(jù)源中的數(shù)據(jù)的復(fù)制,應(yīng)用程序在運(yùn)行時(shí)從緩存讀寫數(shù)據(jù),在特定的時(shí)刻或事件會(huì)同步緩存和物理數(shù)據(jù)源的數(shù)據(jù)。

回到頂部

2. 項(xiàng)目實(shí)戰(zhàn)

   當(dāng) Session 對(duì)象調(diào)用 save() 方法保存一個(gè)對(duì)象后,該對(duì)象會(huì)被放入到 Session 緩存中。

   當(dāng) Session 對(duì)象調(diào)用 get() 或 load() 方法從數(shù)據(jù)庫(kù)取出一個(gè)對(duì)象后,該對(duì)象也會(huì)被放入到 Session 緩存中。

   當(dāng)使用同一個(gè) Session 編寫 HQL 和 QBC 等從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)時(shí),將直接從緩存中讀取數(shù)據(jù),不會(huì)訪問(wèn)數(shù)據(jù)庫(kù)。

   Hibernate 提供了幾個(gè)方法(evit/clear/contains/flush....)來(lái)管理和判斷一級(jí)緩存。

   現(xiàn) JavaEE Dao 層中,提供給外部的數(shù)據(jù)庫(kù)訪問(wèn),每次都會(huì)從 Session 工廠中獲取新的 Session 線程 ,導(dǎo)致一級(jí)緩存很少被利用。

   實(shí)例項(xiàng)目源碼:https://git.oschina.net/LanboEx/hiberdemo

Hibernate緩存機(jī)制的原理

        //1.Hibernate 自身的一級(jí)緩存,可以查看到只輸出了一條 sql
        Session session = getSession();
        UserPO userPO = session.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");
        System.out.println("1. 第一次訪問(wèn) DB:" + userPO.getName() + "," + userPO.getPasswd());

        UserPO userPO1 = session.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");
        System.out.println("2. 第二次訪問(wèn) DB:" + userPO1.getName() + ",一級(jí)緩存中是否存在特定對(duì)象" + session.contains(userPO));

Hibernate緩存機(jī)制的原理

Hibernate緩存機(jī)制的原理

Hibernate緩存機(jī)制的原理

       //2.使用 evite/clear 方法手動(dòng)清除緩存中特定對(duì)象,可以看到 hiber 輸出了兩條 SQL
        Session session1 = getSession();
        UserPO userPO3 = session1.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");
        System.out.println("3. 第一次獲取對(duì)象:" + userPO3.getName() + "," + userPO3.getPasswd());

        session1.evict(userPO3);

        UserPO userPO4 = session1.get(UserPO.class, "031e7a36972e11e6acede16e8241c0fe");
        System.out.println("4. 第二次獲取對(duì)象:" + userPO4.getName() + "," + userPO4.getPasswd());

Hibernate緩存機(jī)制的原理

Hibernate緩存機(jī)制的原理

回到頂部

3. Hibernate 緩存原理

   Hibernate 緩存包括兩大類:

a.Hibernate 一級(jí)緩存,又稱為[Session的緩存]。

   Session 內(nèi)置不能被卸載,Session 的緩存是事務(wù)范圍的緩存(Session 對(duì)象的生命周期通常對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)事務(wù)或者一個(gè)應(yīng)用事務(wù))。

   一級(jí)緩存中,持久化類的每個(gè)實(shí)例都具有唯一的 OID。

b.Hibernate 二級(jí)緩存,又稱為[SessionFactory的緩存]。

   由于 SessionFactory 對(duì)象的生命周期和應(yīng)用程序的整個(gè)過(guò)程對(duì)應(yīng)。

   Hibernate二級(jí)緩存是進(jìn)程范圍或者集群范圍的緩存,有可能出現(xiàn)并發(fā)問(wèn)題,需要采用適當(dāng)?shù)牟l(fā)訪問(wèn)策略,該策略為被緩存的數(shù)據(jù)提供了事務(wù)隔離級(jí)別。

   第二級(jí)緩存是可選的,是一個(gè)可配置的插件,默認(rèn)下 SessionFactory 不會(huì)啟用這個(gè)插件。

   Hibernate 提供了 org.hibernate.cache.CacheProvider 接口,它充當(dāng)緩存插件與 Hibernate 之間的適配器。

   什么樣的數(shù)據(jù)適合存放到第二級(jí)緩存中?

   1) 很少被修改的數(shù)據(jù)

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

   3) 不會(huì)被并發(fā)訪問(wèn)的數(shù)據(jù)

   4) 常量數(shù)據(jù)

不適合存放到第二級(jí)緩存的數(shù)據(jù)?

  1) 經(jīng)常被修改的數(shù)據(jù)

  2) 絕對(duì)不允許出現(xiàn)并發(fā)訪問(wèn)的數(shù)據(jù),如財(cái)務(wù)數(shù)據(jù),絕對(duì)不允許出現(xiàn)并發(fā) 

  3) 與其他應(yīng)用共享的數(shù)據(jù)。

c.Session 的延遲加載實(shí)現(xiàn)要解決兩個(gè)問(wèn)題:正常關(guān)閉連接和確保請(qǐng)求中訪問(wèn)的是同一個(gè) Session。

   Hibernate Session 就是 java.sql.Connection 的一層高級(jí)封裝,一個(gè) Session 對(duì)應(yīng)了一個(gè) Connection。

   Http 請(qǐng)求結(jié)束后正確的關(guān)閉 Session(過(guò)濾器實(shí)現(xiàn)了Session的正常關(guān)閉);

   延遲加載必須保證是同一個(gè) Session( Session 綁定在 ThreadLocal)。

d.Hibernate 查找對(duì)象如何應(yīng)用緩存?

   當(dāng) Hibernate 根據(jù) ID 訪問(wèn)數(shù)據(jù)對(duì)象的時(shí)候,首先從 Session 一級(jí)緩存中查;

   查不到,如果配置了二級(jí)緩存,那么從二級(jí)緩存中查;

   如果都查不到,再查詢數(shù)據(jù)庫(kù),把結(jié)果按照 ID 放入到緩存刪除、更新、增加數(shù)據(jù)的時(shí)候,同時(shí)更新緩存。

e.一級(jí)緩存與二級(jí)緩存的對(duì)比圖


一級(jí)緩存

二級(jí)緩存

存放數(shù)據(jù)的形式

相互關(guān)聯(lián)的持久化對(duì)象

對(duì)象的散裝數(shù)據(jù)

緩存的范圍

事務(wù)范圍,每個(gè)事務(wù)都擁有單獨(dú)的一級(jí)緩存

進(jìn)程范圍或集群范圍,緩存被同一個(gè)進(jìn)程或集群范圍內(nèi)所有事務(wù)共享

并發(fā)訪問(wèn)策略

由于每個(gè)事務(wù)都擁有單獨(dú)的一級(jí)緩存不會(huì)出現(xiàn)并發(fā)問(wèn)題,因此無(wú)須提供并發(fā)訪問(wèn)策略

由于多個(gè)事務(wù)會(huì)同時(shí)訪問(wèn)二級(jí)緩存中的相同數(shù)據(jù),因此必須提供適當(dāng)?shù)牟l(fā)訪問(wèn)策略,來(lái)保證特定的事務(wù)隔離級(jí)別

數(shù)據(jù)過(guò)期策略

處于一級(jí)緩存中的對(duì)象永遠(yuǎn)不會(huì)過(guò)期,除非應(yīng)用程序顯示清空或者清空特定對(duì)象

必須提供數(shù)據(jù)過(guò)期策略,如基于內(nèi)存的緩存中對(duì)象的最大數(shù)目,允許對(duì)象處于緩存中的最長(zhǎng)時(shí)間,以及允許對(duì)象處于緩存中的最長(zhǎng)空閑時(shí)間

物理介質(zhì)

內(nèi)存

內(nèi)存和硬盤,對(duì)象的散裝數(shù)據(jù)首先存放到基于內(nèi)存的緩存中,當(dāng)內(nèi)存中對(duì)象的數(shù)目達(dá)到數(shù)據(jù)過(guò)期策略的maxElementsInMemory值,就會(huì)把其余的對(duì)象寫入基于硬盤的緩存中

緩存軟件實(shí)現(xiàn)

在Hibernate的Session的實(shí)現(xiàn)中包含

由第三方提供,Hibernate僅提供了緩存適配器,用于把特定的緩存插件集成到Hibernate中

啟用緩存的方式

只要通過(guò)Session接口來(lái)執(zhí)行保存,更新,刪除,加載,查詢,Hibernate就會(huì)啟用一級(jí)緩存,對(duì)于批量操作,如不希望啟用一級(jí)緩存,直接通過(guò)JDBCAPI來(lái)執(zhí)行

用戶可以再單個(gè)類或類的單個(gè)集合的粒度上配置第二級(jí)緩存,如果類的實(shí)例被經(jīng)常讀,但很少被修改,就可以考慮使用二級(jí)緩存,只有為某個(gè)類或集合配置了二級(jí)緩存,Hibernate在運(yùn)行時(shí)才會(huì)把它的實(shí)例加入到二級(jí)緩存中

用戶管理緩存的方式

一級(jí)緩存的物理介質(zhì)為內(nèi)存,由于內(nèi)存的容量有限,必須通過(guò)恰當(dāng)?shù)臋z索策略和檢索方式來(lái)限制加載對(duì)象的數(shù)目,Session的evit()方法可以顯示的清空緩存中特定對(duì)象,但不推薦

二級(jí)緩存的物理介質(zhì)可以使內(nèi)存和硬盤,因此第二級(jí)緩存可以存放大容量的數(shù)據(jù),數(shù)據(jù)過(guò)期策略的maxElementsInMemory屬性可以控制內(nèi)存中的對(duì)象數(shù)目,管理二級(jí)緩存主要包括兩個(gè)方面:選擇需要使用第二級(jí)緩存的持久化類,設(shè)置合適的并發(fā)訪問(wèn)策略;選擇緩存適配器,設(shè)置合適的數(shù)據(jù)過(guò)期策略。SessionFactory的evit()方法也可以顯示的清空緩存中特定對(duì)象,但不推薦

到此,相信大家對(duì)“Hibernate緩存機(jī)制的原理”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


新聞名稱:Hibernate緩存機(jī)制的原理
鏈接分享:http://weahome.cn/article/ghicoh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部