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

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

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

 一、查詢緩存配置

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、來賓網(wǎng)站維護(hù)、網(wǎng)站推廣。

1、在hibernate.cfg.xml中加入查詢緩存的策略,  true      啟用查詢緩存的策略,默認(rèn)是false。 

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

代碼如下所示。

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

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

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

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

代碼就如下所示。

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

運(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…

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

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

代碼如下所示。

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ā)出查詢語(yǔ)句,query.iterate()查詢普通屬性它不會(huì)使用查詢緩存 
   //查詢緩存只對(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()查詢普通屬性它是不會(huì)使用查詢緩存,查詢緩存只對(duì)query.list()起作用。

五、關(guān)閉二級(jí)緩存,關(guān)閉查詢緩存,采用query.list()查詢實(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

   顯示結(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

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

六、關(guān)閉二級(jí)緩存,開啟查詢緩存,采用query.list()查詢實(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

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

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

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

七、開啟二級(jí)緩存,開啟查詢緩存,采用query.list()查詢實(shí)體

代碼如下所示。

/** 
 * 開啟查詢,開啟二級(jí)緩存,采用query.list()查詢實(shí)體 
 * 
 * 在兩個(gè)session中發(fā)query.list()查詢 
 */ 
 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

結(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í)行查詢時(shí),會(huì)找到相應(yīng)的id到緩存中查找,在二級(jí)緩存中存在,則直接從二級(jí)緩存中取出數(shù)據(jù),不再向數(shù)據(jù)庫(kù)中發(fā)出sql語(yǔ)句。

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

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

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

總結(jié)

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


文章標(biāo)題:hibernate查詢緩存詳細(xì)分析
本文來源:http://weahome.cn/article/jdsoss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部