最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

hibernate查詢(xún)緩存詳細(xì)分析

 更新時(shí)間:2017年09月07日 10:40:11   作者:動(dòng)力節(jié)點(diǎn)  
這篇文章主要介紹了hibernate查詢(xún)緩存詳細(xì)分析,包括查詢(xún)緩存配置方法及關(guān)閉二級(jí)緩存的詳細(xì)介紹,需要的朋友參考下本文吧

 一、查詢(xún)緩存配置

1、在hibernate.cfg.xml中加入查詢(xún)緩存的策略,  <propertyname="hibernate.cache.use_query_cache">true</property>      啟用查詢(xún)緩存的策略,默認(rèn)是false。 

二、關(guān)閉二級(jí)緩存,采用query.list()查詢(xún)普通屬性

代碼如下所示。

public voidtestCache1() { 
  Session session = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Listnames = session.createQuery("select s.name from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i<names.size(); i++) { 
   Stringname = (String)names.get(i); 
   System.out.println(name); 
   } 
   System.out.println("-------------------------------------------------------"); 
   //不會(huì)發(fā)出查詢(xún)語(yǔ)句,因?yàn)閱⒂貌樵?xún)緩存 
   names= session.createQuery("select s.name from Student s") 
      .setCacheable(true) 
      .list(); 
   for (int i=0;i<names.size(); i++) { 
   Stringname = (String)names.get(i); 
   System.out.println(name); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
 } 

我們可以看到控制臺(tái)輸出語(yǔ)句,僅輸出一次:Hibernate: select student0_.name as col_0_0_ fromt_student student0_ 

由此可知,我們開(kāi)啟了查詢(xún)緩存,第一次進(jìn)行查詢(xún)的時(shí)候,已經(jīng)把結(jié)果放到querycache中,當(dāng)?shù)诙卧俅巫龀鱿嗤牟樵?xún)的時(shí)候,就不再向數(shù)據(jù)庫(kù)發(fā)重復(fù)的sql語(yǔ)句了。

三、關(guān)閉二級(jí)緩存,啟用查詢(xún)緩存,采用query.list()查詢(xún)普通屬性

代碼就如下所示。

public voidtestCache2() { 
  Sessionsession = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Listnames = session.createQuery("select s.name from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i<names.size(); i++) { 
   Stringname = (String)names.get(i); 
   System.out.println(name); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  System.out.println("-------------------------------------------------------"); 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   //不會(huì)發(fā)出查詢(xún)語(yǔ)句,因?yàn)椴樵?xún)緩存和session的生命周期沒(méi)有關(guān)系 
   Listnames = session.createQuery("select s.name from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i<names.size(); i++) { 
   Stringname = (String)names.get(i); 
   System.out.println(name); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  }   
 }  

運(yùn)行結(jié)果如下所示。

控制臺(tái)打印結(jié)果:

select student0_.name as col_0_0_ fromt_student student0_
班級(jí)0的學(xué)生0
班級(jí)0的學(xué)生1
班級(jí)0的學(xué)生2
班級(jí)0的學(xué)生3
班級(jí)0的學(xué)生4
班級(jí)0的學(xué)生5…

我們可以看出,同樣,只打印一次查詢(xún)語(yǔ)句,如果沒(méi)有開(kāi)啟查詢(xún)緩存的話(huà),并且關(guān)閉二級(jí)緩存的情況下,還會(huì)去數(shù)據(jù)庫(kù)再查詢(xún)一遍,而我們的程序中沒(méi)有再去重復(fù)的去數(shù)據(jù)庫(kù)中查詢(xún)的原因是,當(dāng)開(kāi)啟query緩存的時(shí)候,查詢(xún)緩存的生命周期與session無(wú)關(guān)。

四、關(guān)閉二級(jí)緩存,開(kāi)啟查詢(xún),采用query.iterate()查詢(xún)普通屬性

代碼如下所示。

public voidtestCache3() { 
  Sessionsession = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Iteratoriter = session.createQuery("select s.name from Student s") 
       .setCacheable(true) 
       .iterate(); 
   while(iter.hasNext()){ 
   Stringname = (String)iter.next(); 
   System.out.println(name); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  System.out.println("-------------------------------------------------------"); 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   //會(huì)發(fā)出查詢(xún)語(yǔ)句,query.iterate()查詢(xún)普通屬性它不會(huì)使用查詢(xún)緩存 
   //查詢(xún)緩存只對(duì)query.list()起作用 
   Iteratoriter = session.createQuery("select s.name from Student s") 
      .setCacheable(true) 
      .iterate(); 
   while(iter.hasNext()){ 
   Stringname = (String)iter.next(); 
   System.out.println(name); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  
 } 

顯控制臺(tái)顯示結(jié)果打印了兩次sql語(yǔ)句。

-------------------------------------------------------

Hibernate: select student0_.name as col_0_0_from t_student student0_

根據(jù)這樣的結(jié)果我們發(fā)現(xiàn),quer.iterate()查詢(xún)普通屬性它是不會(huì)使用查詢(xún)緩存,查詢(xún)緩存只對(duì)query.list()起作用。

五、關(guān)閉二級(jí)緩存,關(guān)閉查詢(xún)緩存,采用query.list()查詢(xún)實(shí)體

代碼如下所示。

public voidtestCache4() { 
  Sessionsession = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   List students =session.createQuery("select s from Student s") 
       .list(); 
   for (int i=0;i<students.size(); i++) { 
   Studentstudnet = (Student)students.get(i); 
   System.out.println(studnet.getName()); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  System.out.println("-------------------------------------------------------"); 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   //會(huì)發(fā)出查詢(xún)語(yǔ)句,默認(rèn)query.list()每次執(zhí)行都會(huì)發(fā)出查詢(xún)語(yǔ)句 
   List students =session.createQuery("select s from Student s") 
       .list(); 
   for (int i=0;i<students.size(); i++) { 
   Studentstudnet = (Student)students.get(i); 
   System.out.println(studnet.getName()); 
   } 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
 } 

   顯示結(jié)果如下所示。

控制臺(tái)上打印兩次sql語(yǔ)句。

Hibernate:select student0_.id as id0_, student0_.name as name0_, student0_.classesid asclassesid0_ from t_student student0_

班級(jí)0的學(xué)生0
班級(jí)0的學(xué)生1
班級(jí)0的學(xué)生2
班級(jí)0的學(xué)生3
班級(jí)0的學(xué)生4

由此可知,不開(kāi)啟查詢(xún)緩存,默認(rèn)query.list每次執(zhí)行都會(huì)發(fā)出查詢(xún)語(yǔ)句。

六、關(guān)閉二級(jí)緩存,開(kāi)啟查詢(xún)緩存,采用query.list()查詢(xún)實(shí)體

代碼如下所示。

Session session = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Liststudents = session.createQuery("select s from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i<students.size(); i++) { 
   Studentstudnet = (Student)students.get(i); 
   System.out.println(studnet.getName()); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  System.out.println("-------------------------------------------------------"); 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   
   //會(huì)發(fā)出n條查詢(xún)語(yǔ)句,因?yàn)殚_(kāi)啟了查詢(xún)緩存,關(guān)閉了二級(jí)緩存,那么查詢(xún)緩存就會(huì)緩存實(shí)體對(duì)象的id 
   //第二次執(zhí)行query.list(),將查詢(xún)緩存中的id依次取出,分別到一級(jí)緩存和二級(jí)緩存中查詢(xún)相應(yīng)的實(shí)體 
   //對(duì)象,如果存在就使用緩存中的實(shí)體對(duì)象,否則根據(jù)id發(fā)出查詢(xún)學(xué)生的語(yǔ)句 
   Liststudents = session.createQuery("select s from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i<students.size(); i++) { 
   Studentstudnet = (Student)students.get(i); 
   System.out.println(studnet.getName()); 
   } 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 

控制臺(tái)打印sql如下圖所示。

在第一次查詢(xún)的時(shí)候,發(fā)出一條sql語(yǔ)句查詢(xún)出結(jié)果,因?yàn)槲覀冮_(kāi)啟了查詢(xún)緩存,會(huì)把第一次查詢(xún)出的實(shí)體結(jié)果集的id放到查詢(xún)緩存中,第二次再次執(zhí)行query.list()的時(shí)候,會(huì)把id拿出來(lái),到相應(yīng)的緩存去找,因?yàn)槭强鐂ession,在二級(jí)緩存中找不到,所以每次都會(huì)發(fā)出查詢(xún)語(yǔ)句,二級(jí)緩存中不存在,有多少個(gè)id就會(huì)發(fā)出查詢(xún)語(yǔ)句多少次。 

七、開(kāi)啟二級(jí)緩存,開(kāi)啟查詢(xún)緩存,采用query.list()查詢(xún)實(shí)體

代碼如下所示。

/** 
 * 開(kāi)啟查詢(xún),開(kāi)啟二級(jí)緩存,采用query.list()查詢(xún)實(shí)體 
 * 
 * 在兩個(gè)session中發(fā)query.list()查詢(xún) 
 */ 
 public voidtestCache6() { 
  Sessionsession = null; 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   Liststudents = session.createQuery("select s from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i<students.size(); i++) { 
   Studentstudnet = (Student)students.get(i); 
   System.out.println(studnet.getName()); 
   } 
   session.getTransaction().commit(); 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
  System.out.println("-------------------------------------------------------"); 
  try { 
   session= HibernateUtils.getSession(); 
   session.beginTransaction(); 
   
   //不再發(fā)出查詢(xún)語(yǔ)句,因?yàn)榕渲昧硕?jí)緩存和查詢(xún)緩存 
   Liststudents = session.createQuery("select s from Student s") 
       .setCacheable(true) 
       .list(); 
   for (int i=0;i<students.size(); i++) { 
   Studentstudnet = (Student)students.get(i); 
   System.out.println(studnet.getName()); 
   } 
  }catch(Exceptione) { 
   e.printStackTrace(); 
   session.getTransaction().rollback(); 
  }finally { 
   HibernateUtils.closeSession(session); 
  } 
 } 

結(jié)果如下所示

Hibernate: select student0_.id as id0_,student0_.name as name0_, student0_.classesid as classesid0_ from t_studentstudent0_

只發(fā)出一次sql請(qǐng)求,當(dāng)我們第一次執(zhí)行query.list()會(huì)放到二級(jí)緩存中,和query緩存中。當(dāng)我們第一次執(zhí)行查詢(xún)時(shí),會(huì)找到相應(yīng)的id到緩存中查找,在二級(jí)緩存中存在,則直接從二級(jí)緩存中取出數(shù)據(jù),不再向數(shù)據(jù)庫(kù)中發(fā)出sql語(yǔ)句。

八、查詢(xún)緩存總結(jié)

查詢(xún)緩存是緩存普通屬性結(jié)果集的,對(duì)實(shí)體對(duì)象的結(jié)果集會(huì)緩存id。查詢(xún)緩存的生命周期,當(dāng)關(guān)聯(lián)的表發(fā)生修改時(shí),查詢(xún)緩存的生命周期結(jié)束。

而開(kāi)啟緩存的時(shí)候,我們就要去維護(hù)緩存,如果緩存和內(nèi)存中的數(shù)據(jù)不一致的話(huà),和數(shù)據(jù)不同步,可能給用戶(hù)顯示的是臟數(shù)據(jù)了。所以根據(jù)需要使用緩存機(jī)制。

總結(jié)

以上所述是小編給大家介紹的hibernate查詢(xún)緩存詳細(xì)分析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java Retrofit源碼層深入分析

    Java Retrofit源碼層深入分析

    這篇文章主要介紹了Java Retrofit源碼層分析,Retrofit是一個(gè)RESTful的HTTP網(wǎng)絡(luò)請(qǐng)求框架的封裝,網(wǎng)絡(luò)請(qǐng)求的工作本質(zhì)上是OkHttp完成,而Retrofit僅負(fù)責(zé)網(wǎng)絡(luò)請(qǐng)求接口的封裝
    2023-01-01
  • 解決springboot遇到autowire注入為null的問(wèn)題

    解決springboot遇到autowire注入為null的問(wèn)題

    這篇文章主要介紹了解決springboot遇到autowire注入為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Java中==符號(hào)與equals()的使用詳解(測(cè)試兩個(gè)變量是否相等)

    Java中==符號(hào)與equals()的使用詳解(測(cè)試兩個(gè)變量是否相等)

    下面小編就為大家?guī)?lái)一篇Java中==符號(hào)與equals()的使用詳解(測(cè)試兩個(gè)變量是否相等)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • java實(shí)現(xiàn)簡(jiǎn)單的圖書(shū)借閱系統(tǒng)

    java實(shí)現(xiàn)簡(jiǎn)單的圖書(shū)借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的圖書(shū)借閱系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Springboot @Configuration @bean注解作用解析

    Springboot @Configuration @bean注解作用解析

    這篇文章主要介紹了springboot @Configuration @bean注解作用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 詳解SpringBoot構(gòu)建Docker鏡像的3種方式

    詳解SpringBoot構(gòu)建Docker鏡像的3種方式

    這篇文章主要介紹了SpringBoot構(gòu)建Docker鏡像的3種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 基于@RequestBody注解只能注入對(duì)象和map的解決

    基于@RequestBody注解只能注入對(duì)象和map的解決

    這篇文章主要介紹了@RequestBody注解只能注入對(duì)象和map的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 深入理解java中的重載和覆蓋

    深入理解java中的重載和覆蓋

    下面小編就為大家?guī)?lái)一篇深入理解java中的重載和覆蓋。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • 談?wù)凧ava中對(duì)象,類(lèi)和this,super,static關(guān)鍵字的使用

    談?wù)凧ava中對(duì)象,類(lèi)和this,super,static關(guān)鍵字的使用

    對(duì)象:對(duì)象是類(lèi)的一個(gè)實(shí)例,有狀態(tài)和行為。類(lèi):類(lèi)是一個(gè)模板,它描述一類(lèi)對(duì)象的行為和狀態(tài)。本文就來(lái)和大家聊聊Java中對(duì)象,類(lèi)和關(guān)鍵字的使用,需要的可以參考一下
    2022-08-08
  • java GUI實(shí)現(xiàn)加法計(jì)算器

    java GUI實(shí)現(xiàn)加法計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java GUI實(shí)現(xiàn)加法計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評(píng)論

牡丹江市| 柏乡县| 讷河市| 霸州市| 全椒县| 宝丰县| 哈巴河县| 宝丰县| 建瓯市| 泉州市| 长治县| 深州市| 海门市| 光山县| 太白县| 延长县| 遂昌县| 元氏县| 定南县| 河源市| 冕宁县| 吴堡县| 洱源县| 卓尼县| 弥勒县| 绥中县| 高青县| 明水县| 遵义县| 扶绥县| 皮山县| 晋江市| 习水县| 东丽区| 鄱阳县| 西丰县| 弥勒县| 平凉市| 二连浩特市| 雷波县| 竹溪县|