<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-61  評論-159  文章-0  trackbacks-0
             在hibernate中,由于一級緩存的生命周期跟Session的生命周期一樣,所以也可以理解為一級緩存是session緩存。
             一、通過在做查詢的時候,有幾個查詢方法支持一級緩存,它們分別是:load(),get(),iterate(),其中要注意的是iterate方法只對實體對象查詢才支持一級緩存,如果使用iterate來查詢對象里面的相關屬性,則查詢的時候不支持一級緩存。
    1、load()方法。
    例子:
    1Student s = (Student)session.load(Student.class1);
    2            System.out.println(s.getName());
    3            System.out.println("---------------------");
    4            s = (Student)session.load(Student.class1);
    5            System.out.println(s.getName());
    PS:只發出一條sql語句,雖然這里使用兩次load方法,但是第一次load方法對于id為1的記錄進行加載,到第3行才發出一條sql語句及符合的數據,這樣就把數據放在一級緩存里面,在第4行開始繼續使用load就從一級緩存里面抽取。

    2、get()方法。
    例子:
    1Student s = (Student)session.get(Student.class1);
    2            System.out.println(s.getName());
    3            System.out.println("---------------------");
    4            s = (Student)session.load(Student.class1);
    5            System.out.println(s.getName());
    PS:跟1中load一樣,只發出一條sql語句。

    3、iterate()方法查詢實體對象
    例子:
    1Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
    2            System.out.println("student.name=" + student.getName());
    3            
    4            //會發出查詢id的sql,不會發出查詢實體對象的sql,因為iterate使用緩存
    5            student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();
    6            System.out.println("student.name=" + student.getName());
    PS:總共發出3條sql語句,1、2行發出兩條語句,1條是查詢實體對象的sql,另一條是查詢實體對象的name屬性,由于使用一級緩存,之前1、2行查詢的實體存放在一級緩存里面,所以5、6行利用一級緩存里面的數據只發出一條查詢id的sql。

    4、iterate()方法查詢實體對象屬性(不支持一級緩存)
    例子:
    1String name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
    2            System.out.println("student.name=" + name);
    3            
    4            //iterate查詢普通屬性,一級緩存不會緩存,所以發出sql
    5            //一級緩存是緩存實體對象的
    6            name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();
    7            System.out.println("student.name=" + name);

    PS:由于iterate()方法查詢實體對象屬性,一級緩存不會產生作用,所以發出兩條sql語句。

           二、一級緩存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通過clear(),evict()方法來清除緩存,當不需要使用一級緩存或者是更加高效率使用一級緩存。
                  如果在一次性更新或者加入數量量比較大的情況下,更加要管理好一級緩存。
    例子:
     1for(int i=0;i<10000;i++)
     2            {
     3                Student s = new Student();
     4                s.setName("s"+i);
     5                session.save(s);
     6                if(i%20==0)
     7                {
     8                    session.flush();
     9                    session.clear();
    10                }

    11            }
    PS:在數據量比較大的情況下管理一級緩存的做法,一般都是設定一定數量的記錄給更新或者保存等操作之后,避免一次性大量的實體數據入庫導致內存溢出,所以才去先是用第8行的flush和第9行的clear方法來實現比較好的緩存管理。在數據量特別大的時候,可以使用jdbc來實現,因為hibernate不太適合于數據量特別大的場合使用,如果連jdbc都滿足不了數據量的效率要求,只好利用相關的數據庫機制來實現。


    -------------------------------------------------------------------------------------------------
    PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者文章的詳細出處地址,否則不允許轉載,多謝合作!
    posted on 2008-10-31 23:39 apple0668 閱讀(801) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 色网站在线免费观看| 精品多毛少妇人妻AV免费久久| 卡一卡二卡三在线入口免费| 鲁啊鲁在线视频免费播放| 亚洲AV色香蕉一区二区| 成人免费一区二区无码视频| 特级aa**毛片免费观看| 亚洲无圣光一区二区| www.亚洲精品| 99久久99久久精品免费看蜜桃| 国产精品亚洲专区无码牛牛 | 国产成人免费高清激情视频| 香港经典a毛片免费观看看| 亚洲AV中文无码字幕色三| 波多野结衣久久高清免费| 好紧我太爽了视频免费国产| 亚洲日韩AV一区二区三区四区| 久久久久久a亚洲欧洲aⅴ| 免费看大黄高清网站视频在线| 日本在线看片免费| 色吊丝免费观看网站| 亚洲乱码在线视频| 亚洲国产一二三精品无码| 永久免费AV无码网站在线观看| 免费A级毛片无码A∨| 日日躁狠狠躁狠狠爱免费视频| 亚洲制服丝袜第一页| 亚洲成A人片在线观看WWW| 国产人成免费视频| 一二三四免费观看在线视频中文版| 三级网站在线免费观看| 色噜噜噜噜亚洲第一| 激情综合亚洲色婷婷五月| 亚洲av无码不卡| 亚洲国产精品嫩草影院久久| 青青草国产免费久久久91| 91成年人免费视频| 日韩av无码久久精品免费| 国内精品99亚洲免费高清| 青青久久精品国产免费看| 亚洲成a人片在线不卡一二三区|