隨筆-61  評(píng)論-159  文章-0  trackbacks-0
                   在hibernate中,由于一級(jí)緩存的生命周期跟Session的生命周期一樣,所以也可以理解為一級(jí)緩存是session緩存。
                   一、通過(guò)在做查詢的時(shí)候,有幾個(gè)查詢方法支持一級(jí)緩存,它們分別是:load(),get(),iterate(),其中要注意的是iterate方法只對(duì)實(shí)體對(duì)象查詢才支持一級(jí)緩存,如果使用iterate來(lái)查詢對(duì)象里面的相關(guān)屬性,則查詢的時(shí)候不支持一級(jí)緩存。
          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:只發(fā)出一條sql語(yǔ)句,雖然這里使用兩次load方法,但是第一次load方法對(duì)于id為1的記錄進(jìn)行加載,到第3行才發(fā)出一條sql語(yǔ)句及符合的數(shù)據(jù),這樣就把數(shù)據(jù)放在一級(jí)緩存里面,在第4行開(kāi)始繼續(xù)使用load就從一級(jí)緩存里面抽取。

          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中l(wèi)oad一樣,只發(fā)出一條sql語(yǔ)句。

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

          4、iterate()方法查詢實(shí)體對(duì)象屬性(不支持一級(jí)緩存)
          例子:
          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查詢普通屬性,一級(jí)緩存不會(huì)緩存,所以發(fā)出sql
          5            //一級(jí)緩存是緩存實(shí)體對(duì)象的
          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()方法查詢實(shí)體對(duì)象屬性,一級(jí)緩存不會(huì)產(chǎn)生作用,所以發(fā)出兩條sql語(yǔ)句。

                 二、一級(jí)緩存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通過(guò)clear(),evict()方法來(lái)清除緩存,當(dāng)不需要使用一級(jí)緩存或者是更加高效率使用一級(jí)緩存。
                        如果在一次性更新或者加入數(shù)量量比較大的情況下,更加要管理好一級(jí)緩存。
          例子:
           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:在數(shù)據(jù)量比較大的情況下管理一級(jí)緩存的做法,一般都是設(shè)定一定數(shù)量的記錄給更新或者保存等操作之后,避免一次性大量的實(shí)體數(shù)據(jù)入庫(kù)導(dǎo)致內(nèi)存溢出,所以才去先是用第8行的flush和第9行的clear方法來(lái)實(shí)現(xiàn)比較好的緩存管理。在數(shù)據(jù)量特別大的時(shí)候,可以使用jdbc來(lái)實(shí)現(xiàn),因?yàn)閔ibernate不太適合于數(shù)據(jù)量特別大的場(chǎng)合使用,如果連jdbc都滿足不了數(shù)據(jù)量的效率要求,只好利用相關(guān)的數(shù)據(jù)庫(kù)機(jī)制來(lái)實(shí)現(xiàn)。


          -------------------------------------------------------------------------------------------------
          PS:本博客文章,如果沒(méi)有注明是有“轉(zhuǎn)”字樣,屬于本人原創(chuàng)。如果需要轉(zhuǎn)載,務(wù)必注明作者文章的詳細(xì)出處地址,否則不允許轉(zhuǎn)載,多謝合作!
          posted on 2008-10-31 23:39 apple0668 閱讀(805) 評(píng)論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 河西区| 察雅县| 平罗县| 泰州市| 九台市| 荥经县| 宝山区| 黄山市| 湖南省| 金川县| 英德市| 陕西省| 微博| 息烽县| 嘉禾县| 湛江市| 徐汇区| 昌平区| 东兰县| 海盐县| 吴堡县| 汝城县| 滦南县| 雅江县| 东宁县| 安顺市| 自治县| 化德县| 平舆县| 星座| 田东县| 沙雅县| 龙里县| 汽车| 龙海市| 会昌县| 安吉县| 郯城县| 洪雅县| 延津县| 台前县|