欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Hibernate一級緩存和二級緩存詳解

 更新時間:2019年03月29日 12:01:03   作者:徐劉根  
今天小編就為大家分享一篇關于Hibernate一級緩存和二級緩存詳解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

一、一級緩存二級緩存的概念解釋

(1)一級緩存就是Session級別的緩存,一個Session做了一個查詢操作,它會把這個操作的結果放在一級緩存中,如果短時間內這個session(一定要同一個session)又做了同一個操作,那么hibernate直接從一級緩存中拿,而不會再去連數(shù)據(jù)庫,取數(shù)據(jù);

(2)二級緩存就是SessionFactory級別的緩存,顧名思義,就是查詢的時候會把查詢結果緩存到二級緩存中,如果同一個sessionFactory創(chuàng)建的某個session執(zhí)行了相同的操作,hibernate就會從二級緩存中拿結果,而不會再去連接數(shù)據(jù)庫;

(3)Hibernate中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬于事務范圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬于進程范圍或群集范圍的緩存。這一級別的緩存可以進行配置和更改,并且可以動態(tài)加載和卸載。 Hibernate還為查詢結果提供了一個查詢緩存,它依賴于第二級緩存;

二、一級緩存和二級緩存的比較

(1)第一級緩存 第二級緩存 存放數(shù)據(jù)的形式相互關聯(lián)的持久化對象 對象的散裝數(shù)據(jù) 緩存的范圍事務范圍,每個事務都有單獨的第一級緩存進程范圍或集群范圍,緩存被同一個進程或集群范圍內的所有事務共享并發(fā)訪問策略由于每個事務都擁有單獨的第一級緩存,不會出現(xiàn)并發(fā)問題,無需提供并發(fā)訪問策略由于多個事務會同時訪問第二級緩存中相同數(shù)據(jù),因此必須提供適當?shù)牟l(fā)訪問策略,來保證特定的事務隔離級別數(shù)據(jù)過期策略沒有提供數(shù)據(jù)過期策略。

(2)處于一級緩存中的對象永遠不會過期,除非應用程序顯式清空緩存或者清除特定的對象必須提供數(shù)據(jù)過期策略,如基于內存的緩存中的對象的最大數(shù)目,允許對象處于緩存中的最長時間,以及允許對象處于緩存中的最長空閑時間物理存儲介質內存內存和硬盤。

(3)對象的散裝數(shù)據(jù)首先存放在基于內存的緩存中,當內存中對象的數(shù)目達到數(shù)據(jù)過期策略中指定上限時,就會把其余的對象寫入基于硬盤的緩存中。

(4)緩存的軟件實現(xiàn)在Hibernate的Session的實現(xiàn)中包含了緩存的實現(xiàn)由第三方提供,Hibernate僅提供了緩存適配器(CacheProvider)。用于把特定的緩存插件集成到Hibernate中。

(5)啟用緩存的方式只要應用程序通過Session接口來執(zhí)行保存、更新、刪除、加載和查詢數(shù)據(jù)庫數(shù)據(jù)的操作,Hibernate就會啟用第一級緩存,把數(shù)據(jù)庫中的數(shù)據(jù)以對象的形式拷貝到緩存中,對于批量更新和批量刪除操作,如果不希望啟用第一級緩存,可以繞過Hibernate API,直接通過JDBC API來執(zhí)行指操作。

(6)用戶可以在單個類或類的單個集合的粒度上配置第二級緩存。如果類的實例被經常讀但很少被修改,就可以考慮使用第二級緩存。

(7)只有為某個類或集合配置了第二級緩存,Hibernate在運行時才會把它的實例加入到第二級緩存中。用戶管理緩存的方式第一級緩存的物理介質為內存,由于內存容量有限,必須通過恰當?shù)臋z索策略和檢索方式來限制加載對象的數(shù)目。Session的 evit()方法可以顯式清空緩存中特定對象,但這種方法不值得推薦。第二級緩存的物理介質可以是內存和硬盤,因此第二級緩存可以存放大量的數(shù)據(jù),數(shù)據(jù)過期策略的maxElementsInMemory屬性值可以控制內存中的對象數(shù)目。

(8)管理第二級緩存主要包括兩個方面:選擇需要使用第二級緩存的持久類,設置合適的并發(fā)訪問策略:選擇緩存適配器,設置合適的數(shù)據(jù)過期策略。

三、 一級緩存的管理

(1)當應用程序調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據(jù)緩存中對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。 Session為應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數(shù)指定的持久化對象。 clear():清空緩存中所有持久化對象。

(2)save、update、saveOrupdate、load、list、iterate、lock會向一級緩存存放數(shù)據(jù);

save 案例:

 //添加一個學生
  Student student=new Student();
  student.setName("小東");
  s.save(student);//放入一級緩存
  //我馬上查詢
  Student stu2=(Student) s.get(Student.class, student.getId()); //select
  System.out.println("你剛剛加入的學生名字是"+stu2.getName());

(3)什么操作會從一級緩存取數(shù)據(jù):get、load、list

get / load 會首先從一級緩存中取,如沒有.再有不同的操作[get 會立即向數(shù)據(jù)庫發(fā)請求,而load 會返回一個代理對象,直到用戶真的去使用數(shù)據(jù),才會向數(shù)據(jù)庫發(fā)請求;

//查詢45號學生
  Student stu=(Student) s.get(Student.class, 45);
  System.out.println("|||||||||||||||||||");
  String hql="from Student where id=45";
  Student stu2=(Student) s.createQuery(hql).uniqueResult();
  System.out.println(stu2.getName());

從上面的案例,我們看出 query.list() query.uniueResut() 不會從一級緩取數(shù)據(jù)! 但是query.list 或者query.uniqueRestu() 會向一級緩存放數(shù)據(jù)的.

注意:

① 一級緩存不需要配置,就可以使用,它本身沒有保護機制,所以我們程序員要考慮這個問題,我們可以同 evict 或者 clear來清除session緩存中對象. evict 是清除一個對象,clear是清除所有的sesion緩存對象

② session級緩存中對象的生命周期, 當session關閉后,就自動銷毀.

③ 我們自己用HashMap來模擬一個Session緩存,加深對緩存的深入.

四、Hibernate二級緩存的管理

1. Hibernate二級緩存策略的一般過程如下:

1) 條件查詢的時候,總是發(fā)出一條select * from table_name where …. (選擇所有字段)這樣的SQL語句查詢數(shù)據(jù)庫,一次獲得所有的數(shù)據(jù)對象。

2) 把獲得的所有數(shù)據(jù)對象根據(jù)ID放入到第二級緩存中。

3) 當Hibernate根據(jù)ID訪問數(shù)據(jù)對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數(shù)據(jù)庫,把結果按照ID放入到緩存。

4) 刪除、更新、增加數(shù)據(jù)的時候,同時更新緩存。Hibernate二級緩存策略,是針對于ID查詢的緩存策略,對于條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。

5) 二級緩存的對象可能放在內存,也可能放在磁盤.

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

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

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

3) 不會被并發(fā)訪問的數(shù)據(jù) 

4) 參考數(shù)據(jù),指的是供應用參考的常量數(shù)據(jù),它的實例數(shù)目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。

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

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

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

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

4. 常用的緩存插件 Hibernater二級緩存是一個插件,下面是幾種常用的緩存插件:

◆EhCache:可作為進程范圍的緩存,存放數(shù)據(jù)的物理介質可以是內存或硬盤,對Hibernate的查詢緩存提供了支持。

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

◆SwarmCache:可作為群集范圍內的緩存,但不支持Hibernate的查詢緩存。

◆JBossCache:可作為群集范圍內的緩存,支持事務型并發(fā)訪問策略,對Hibernate的查詢緩存提供了支持。

5. 配置Hibernate二級緩存的主要步驟:

1) 選擇需要使用二級緩存的持久化類,設置它的命名緩存的并發(fā)訪問策略。這是最值得認真考慮的步驟。

2) 選擇合適的緩存插件,然后編輯該插件的配置文件。

<property name="hbm2ddl.auto">update</property>
 <!-- 啟動二級緩存 -->
 <property name="cache.use_second_level_cache">true</property>
 <!-- 指定使用哪種二級緩存 -->
 <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property>
 <mapping resource="com/hsp/domain/Department.hbm.xml" />
 <mapping resource="com/hsp/domain/Student.hbm.xml" />
 <!-- 指定哪個domain啟用二級緩存 
 特別說明二級緩存策略:
 1. read-only
 2. read-write
 3. nonstrict-read-write
 4. transcational
 -->
 <class-cache class="com.hsp.domain.Student" usage="read-write"/>

3)可以把oscache.properties文件放在 src目錄下,這樣你可以指定放入二級緩存的對象capacity 大小. 默認1000

6.使用二級緩存:

// TODO Auto-generated method stub
 //通過獲取一個sesion,讓hibernate框架運行(config->加載hibernate.cfg.xml)
 Session s=null;
 Transaction tx=null;
 try {
  //我們使用基礎模板來講解.
  s=HibernateUtil.openSession();
  tx=s.beginTransaction();
  //查詢45號學生
  Student stu1=(Student) s.get(Student.class, 45);//45->一級緩存 
  System.out.println(stu1.getName());
  tx.commit();
 } catch (Exception e) {
  e.printStackTrace();
  if(tx!=null){
  tx.rollback();
  }
 }finally{
  if(s!=null && s.isOpen()){
  s.close();
  }
 }
 System.out.println("*********************************");
 try {
  //我們使用基礎模板來講解.
  s=HibernateUtil.openSession();
  tx=s.beginTransaction();
  //查詢45號學生
  Student stu1=(Student) s.get(Student.class, 45); 
  System.out.println(stu1.getName());
  
  Student stu3=(Student) s.get(Student.class, 46); 
  System.out.println(stu3.getName());
  tx.commit();
 } catch (Exception e) {
  e.printStackTrace();
  if(tx!=null){
  tx.rollback();
  }
 }finally{
  if(s!=null && s.isOpen()){
  s.close();
  }
 }
 //完成一個統(tǒng)計,統(tǒng)計的信息在Sessfactory
 //SessionFactory對象.
 Statistics statistics= HibernateUtil.getSessionFactory().getStatistics();
 System.out.println(statistics);
 System.out.println("放入"+statistics.getSecondLevelCachePutCount());
 System.out.println("命中"+statistics.getSecondLevelCacheHitCount());
 System.out.println("錯過"+statistics.getSecondLevelCacheMissCount());

在配置了二級緩存后,請大家要注意可以通過 Statistics,查看你的配置命中率高不高

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

  • 深入理解SpringMVC中央調度器DispatcherServlet

    深入理解SpringMVC中央調度器DispatcherServlet

    這篇文章主要介紹了SpringMVC核心之中央調度器DispatcherServlet的相關知識,包括SpringMVC請求處理過程及SrpingMVC容器和spring?IOC容器關系,需要的朋友可以參考下
    2022-05-05
  • java用類加載器的5種方式讀取.properties文件

    java用類加載器的5種方式讀取.properties文件

    這篇文章主要介紹了java用類加載器的5種方式讀取.properties文件,詳細的介紹了這5種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 解決SpringBoot項目啟動成功但接口訪問404的問題

    解決SpringBoot項目啟動成功但接口訪問404的問題

    這篇文章主要介紹了如何解決SpringBoot項目啟動成功但接口訪問404的問題,具有很好的參考價值,希望對大家有所幫助,接下來就跟著小編一起來看看吧
    2023-07-07
  • Java日常練習題,每天進步一點點(40)

    Java日常練習題,每天進步一點點(40)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Spring中的之啟動過程obtainFreshBeanFactory詳解

    Spring中的之啟動過程obtainFreshBeanFactory詳解

    這篇文章主要介紹了Spring中的之啟動過程obtainFreshBeanFactory詳解,在refresh時,prepareRefresh后,馬上就調用了obtainFreshBeanFactory創(chuàng)建beanFactory以及掃描bean信息(beanDefinition),并通過BeanDefinitionRegistry注冊到容器中,需要的朋友可以參考下
    2024-02-02
  • 詳解springboot中各個版本的redis配置問題

    詳解springboot中各個版本的redis配置問題

    這篇文章主要介紹了詳解springboot中各個版本的redis配置問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • idea如何關閉右側類顯示方法

    idea如何關閉右側類顯示方法

    這篇文章主要介紹了idea如何關閉右側類顯示方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • JAVA對象JSON數(shù)據(jù)互相轉換的四種常見情況

    JAVA對象JSON數(shù)據(jù)互相轉換的四種常見情況

    這篇文章主要介紹了JAVA對象JSON數(shù)據(jù)互相轉換的四種常見情況,需要的朋友可以參考下
    2014-04-04
  • Java從單體架構升級到微服務要注意的一些問題

    Java從單體架構升級到微服務要注意的一些問題

    這篇文章主要介紹了Java從單體架構升級到微服務要注意的一些問題,對架構感興趣的同學,可以參考下
    2021-04-04
  • System.getProperty(“l(fā)ine.separator“)含義及意義詳解

    System.getProperty(“l(fā)ine.separator“)含義及意義詳解

    這篇文章主要介紹了System.getProperty(“l(fā)ine.separator“)含義,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05

最新評論