hibernate一級緩存

          hibernate 一級緩存:(緩存的是實體對象)

          一級緩存很短和session的生命周期一致,一級緩存也叫session級的緩存或事務緩存

           

          哪些方法支持一級緩存:

          *get()

          *load()

          *iterate()  (查詢實體對象)

           

          如何管理一級緩存:

          * session.clear() session.evict()

           

          如何避免一次性大量的實體數(shù)據(jù)入庫導致內存溢出

          *先flush,再clear

           

          如果數(shù)據(jù)量特別大,考慮采用jdbc實現(xiàn),如果jdbc也不能滿足要求,可以考慮采用數(shù)據(jù)庫本身的特定導入工具

           

          一.Load測試: 在同一個session中發(fā)出兩次load查詢

                 Student sutdent = (Student)session.load(Student.class,1);

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

           

                 sutdent = (Student)session.load(Student.class,1);

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

                 在同一個session中發(fā)出兩次load查詢,第一次load的時候不會去查詢數(shù)據(jù)庫,因為他是LAZY的,當使用的時候才去查詢數(shù)據(jù)庫,  第二次load的時候也不會,當使用的時候也不會查詢數(shù)據(jù)庫,因為他在緩存里找到,不會發(fā)出sql

           

           

          Load測試: 開啟兩個session中發(fā)出兩次load查詢

          Student sutdent = (Student)session.load(Student.class,1);

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

          sessioin.close();

          ………..

                 sutdent = (Student)session.load(Student.class,1);

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

                 開啟兩個session中發(fā)出兩次load查詢,第一次load的時候不會去查詢數(shù)據(jù)庫,因為他是LAZY的,當使用的時候才去查詢數(shù)據(jù)庫,  第二次load的時候也不會,當使用的時候查詢數(shù)據(jù)庫,因為session間不能共享一級緩存的數(shù)據(jù),因為他會隨session的生命周期存在和消亡

           

           

          二.Get測試: 在同一個session中發(fā)出兩次get查詢

              Student sutdent = (Student)session.get(Student.class,1);

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

           

                 sutdent = (Student)session.get(Student.class,1);

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

                 在同一個session中發(fā)出兩次get查詢, 第一次get的時候去查詢數(shù)據(jù)庫,第二次get的時候不會查詢數(shù)據(jù)庫,因為他在緩存里找到,不會發(fā)出sql

           

           

          三.iterate測試: 在同一個session中發(fā)出兩次iterator查詢

          Student student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();

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

           

          student = (Student)session.createQuery(“from Student s where s.id=1”).iterate().next();

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

                 在同一個session中發(fā)出兩次iterator查詢,第一次iterate().next()的時候會發(fā)出查詢id的sql,使用的時候會發(fā)出相應的查詢實體對象,第二次iterate().next()的時候會發(fā)出查詢id的sql,不會發(fā)出查詢實體對象的sql,因為iterate使用緩存,不會發(fā)出sql

           

           

          四.Iterate查詢屬性測試: 同一個session中發(fā)出兩次查詢屬性

          String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();

          System.out.println(name);

           

          String name = (String)session.createQuery(“select s.name from Student s where s.id=1”).iterate().next();

          System.out.println(name);

                 在同一個session中發(fā)出兩次查詢屬性, 第一次iterate().next()的時候會發(fā)出查詢屬性的sql,第二次iterate().next()的時候會發(fā)出查詢屬性的sql,iterate查詢普通屬性,一級緩存不會緩存,所以會發(fā)出sql

           

           

          五.同一個session中先save,再發(fā)出load查詢save過的數(shù)據(jù)

           

                 Student stu = new Student();

                 stu.setName(“王五”);

           

             Serializable id = session.save(stu);

           

          Student sutdent = (Student)session.load(Student.class,id);

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

           

                

          save的時候,他會在緩存里放一份,不會發(fā)出sql,因為save是使用緩存的

          六.同一個session中先調用load查詢,然后執(zhí)行sessio.clear()session.evict(),再調用load查詢

           

          Student sutdent = (Student)session.load(Student.class,1);

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

                 session.clear();

           

          Student sutdent = (Student)session.load(Student.class,1);

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

           

           

                 sessio.clear()或session.evict()可以管理一級緩存,一級緩存無法取消,但可以管理.

          上面的語句都會發(fā)出sql 因為一級緩存中的實體被清除了

           

          七.向數(shù)據(jù)庫中批量加入1000條數(shù)據(jù)

           

          for(int i=0;i<1000;i++){

                 Student student = new Student();

                 student.setName(“s” + i);

                 session.save(student);

          //每20條數(shù)據(jù)就強制session將數(shù)據(jù)持久化,同時清除緩存,避免大量數(shù)據(jù)造成內存溢出

                 if( i %20 == 0 ){

                        session.flush();

                        session.clear();

          }

          }

           

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

          導航

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

          統(tǒng)計

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          agile

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宽城| 云浮市| 凌海市| 叙永县| 宁城县| 肥乡县| 宁安市| 定远县| 万源市| 曲靖市| 安多县| 华池县| 茶陵县| 蒲城县| 浦江县| 津南区| 新绛县| 融水| 呼图壁县| 即墨市| 肃宁县| 中超| 中山市| 乾安县| 墨江| 濮阳市| 临沧市| 左权县| 临安市| 绵竹市| 金川县| 武山县| 朝阳县| 辉南县| 二连浩特市| 赤壁市| 崇左市| 景宁| 和田市| 琼结县| 济宁市|