hibernate查詢緩存


           

          hibernate查詢緩存(hibernate默認(rèn)是關(guān)閉的)

           

          查詢緩存是針對普通屬性結(jié)果集的緩存

          對實(shí)體對象的結(jié)果集只緩存id

           

          查詢緩存的生命周期,當(dāng)前關(guān)聯(lián)的表發(fā)生修改,那么查詢緩存生命周期結(jié)束

           

          查詢緩存的配置和使用:

          1. 啟用查詢緩存:在hibernate.cfg.xml中加入:

          <property name=”hibernate.cache.use_query_cache”>true</property>

            2. 在程序中必須手動(dòng)啟用查詢緩存,如:query.setCacheable(true);

           

           

          測試查詢緩存:

          一.  開啟查詢緩存,關(guān)閉二級緩存,開啟一個(gè)session,分別調(diào)用query.list  (查詢屬性)

           

          Query query = session.createQuery(“select s.name from Student s”);

          //啟用查詢緩存

          query.setCacheable(true);

           

          List names = query.list();

          for(Iterator iter = names.terator();iter.hasNext();){

                 String name = (String)iter.next();

                 System.out.println(name);

          }

           

          System.out.println(“------------------------------------------”);

           

          query = session.createQuery(“select s.name from Student s”);

          //啟用查詢緩存

          query.setCacheable(true);

           

          names = query.list();

          for(Iterator iter = names.terator();iter.hasNext();){

                 String name = (String)iter.next();

                 System.out.println(name);

          }

          第二次沒有去查詢數(shù)據(jù)庫,因?yàn)閱⒂昧瞬樵兙彺?/p>

           

          二.  開啟查詢緩存,關(guān)閉二級緩存,開啟兩個(gè)session,分別調(diào)用query.list  (查詢屬性)

           

          Query query = session.createQuery(“select s.name from Student s”);

          //啟用查詢緩存

          query.setCacheable(true);

           

          List names = query.list();

          for(Iterator iter = names.terator();iter.hasNext();){

                 String name = (String)iter.next();

                 System.out.println(name);

          }

           

          session.close();

           

          System.out.println(“------------------------------------------”);

          ………

          Query query = session.createQuery(“select s.name from Student s”);

          //啟用查詢緩存

          query.setCacheable(true);

           

          List names = query.list();

          for(Iterator iter = names.terator();iter.hasNext();){

                 String name = (String)iter.next();

                 System.out.println(name);

          }

          第二次沒有去查詢數(shù)據(jù)庫,因?yàn)椴樵兙彺嫔芷谂csession生命周期無關(guān)

           

          三.  開啟查詢緩存,關(guān)閉二級緩存,開啟兩個(gè)session,分別調(diào)用query.iterate (查詢屬性)

           

          Query query = session.createQuery(“select s.name from Student s”);

          //啟用查詢緩存

          query.setCacheable(true);

           

          for(Iterator iter =query.iterate();iter.hasNext();){

                 String name = (String)iter.next();

                 System.out.println(name);

          }

           

          session.close();

           

          System.out.println(“------------------------------------------”);

          ………

          Query query = session.createQuery(“select s.name from Student s”);

          //啟用查詢緩存

          query.setCacheable(true);

           

          for(Iterator iter = query.iterate();iter.hasNext();){

                 String name = (String)iter.next();

                 System.out.println(name);

          }

          第二去查詢數(shù)據(jù)庫,因?yàn)椴樵兙彺嬷粚uery.list()起作用,對query.iterate()不起作用,也就是說query.iterate()不使用查詢緩存

           

          四.  關(guān)閉查詢緩存,關(guān)閉二級緩存,開啟兩個(gè)session,分別調(diào)用query.list (查詢實(shí)體對象)

           

          Query query = session.createQuery(“ from Student s”);

          //query.setCacheable(true);

          List students = query.list();

          for(Iterator iter = students.iterate();iter.hasNext();){

                 Student stu = (Student)iter.next();

                 System.out.println(stu.getName());

          }

           

          session.close();

           

          System.out.println(“------------------------------------------”);

          ………

          Query query = session.createQuery(“ from Student s”);

          //query.setCacheable(true);

          List students = query.list();

          for(Iterator iter = students.iterate();iter.hasNext();){

                 Student stu = (Student)iter.next();

                 System.out.println(stu.getName());

          }

          第二去查詢數(shù)據(jù)庫,因?yàn)閘ist默認(rèn)每次都會(huì)發(fā)出查詢sql

           

          五.  開啟查詢緩存,關(guān)閉二級緩存,開啟兩個(gè)session,分別調(diào)用query.list (查詢實(shí)體對象)

           

          Query query = session.createQuery(“ from Student s”);

          query.setCacheable(true);

          List students = query.list();

          for(Iterator iter = students.iterate();iter.hasNext();){

                 Student stu = (Student)iter.next();

                 System.out.println(stu.getName());

          }

           

          session.close();

           

          System.out.println(“------------------------------------------”);

          ………

          Query query = session.createQuery(“ from Student s”);

          query.setCacheable(true);

          List students = query.list();

          for(Iterator iter = students.iterate();iter.hasNext();){

                 Student stu = (Student)iter.next();

                 System.out.println(stu.getName());

          第二去查詢數(shù)據(jù)庫時(shí),會(huì)發(fā)出N條sql語句,因?yàn)殚_啟了查詢緩存,關(guān)閉了二級緩存,那么查詢緩存會(huì)緩存實(shí)體對象的id,所以hibernate會(huì)根據(jù)實(shí)體對象的id去查詢相應(yīng)的實(shí)體,如果緩存中不存在相應(yīng)的實(shí)體,那么將發(fā)出根據(jù)實(shí)體id查詢的sql語句,否則不會(huì)發(fā)出sql,使用緩存中的數(shù)據(jù)

           

          六.  開啟查詢緩存,開啟二級緩存,開啟兩個(gè)session,分別調(diào)用query.list (查詢實(shí)體對象)

           

          Query query = session.createQuery(“ from Student s”);

          query.setCacheable(true);

          List students = query.list();

          for(Iterator iter = students.iterate();iter.hasNext();){

                 Student stu = (Student)iter.next();

                 System.out.println(stu.getName());

          }

           

          session.close();

           

          System.out.println(“------------------------------------------”);

          ………

          Query query = session.createQuery(“ from Student s”);

          query.setCacheable(true);

          List students = query.list();

          for(Iterator iter = students.iterate();iter.hasNext();){

                 Student stu = (Student)iter.next();

                 System.out.println(stu.getName());

          }

           

          第二不會(huì)發(fā)出sql,因?yàn)殚_啟了二級緩存和查詢緩存,查詢緩存緩存了實(shí)體對象的id列表,hibernate會(huì)根據(jù)實(shí)體對象的id列表到二級緩存中取得相應(yīng)的數(shù)據(jù)

          posted on 2009-04-06 11:58 胡鵬 閱讀(4889) 評論(0)  編輯  收藏 所屬分類: hibernate

          導(dǎo)航

          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黄石市| 闽侯县| 绵竹市| 鞍山市| 诸暨市| 安化县| 尼木县| 武邑县| 昌宁县| 丰城市| 河曲县| 万年县| 荆州市| 工布江达县| 临湘市| 年辖:市辖区| 慈溪市| 苏州市| 平顶山市| 商城县| 宜昌市| 廊坊市| 福贡县| 饶平县| 安庆市| 志丹县| 新野县| 永宁县| 资中县| 浮山县| 纳雍县| 石渠县| 姜堰市| 鹤庆县| 浦江县| 兰考县| 文水县| 邵东县| 鲁甸县| 理塘县| 黑水县|