日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
輕松解讀Hibernate一級緩存

在學(xué)習(xí)Hibernate中,我們都知道由于一級Hibernate緩存的生命周期跟Session的生命周期一樣,所以也可以理解為一級Hibernate緩存是session緩存。

一、通過在做查詢的時(shí)候,有幾個(gè)查詢方法支持一級Hibernate緩存,它們分別是:load(),get(),iterate(),其中要注意的是iterate方法只對實(shí)體對象查詢才支持一級緩存,如果使用iterate來查詢對象里面的相關(guān)屬性,則查詢的時(shí)候不支持一級緩存。

1、load()方法。

例子:

 
 
 
  1. Student s = (Student)session.load(Student.class, 1);  
  2.             System.out.println(s.getName());  
  3.             System.out.println("---------------------");  
  4.             s = (Student)session.load(Student.class, 1);  
  5.            System.out.println(s.getName()); 

只發(fā)出一條sql語句,雖然這里使用兩次load方法,但是***次load方法對于id為1的記錄進(jìn)行加載,到第3行才發(fā)出一條sql語句及符合的數(shù)據(jù),這樣就把數(shù)據(jù)放在一級緩存里面,在第4行開始繼續(xù)使用load就從一級緩存里面抽取。

2、get()方法。

例子:

 
 
 
  1. Student s = (Student)session.get(Student.class, 1);  
  2.             System.out.println(s.getName());  
  3.            System.out.println("---------------------");  
  4.             s = (Student)session.load(Student.class, 1);  
  5.             System.out.println(s.getName()); 

跟1中l(wèi)oad一樣,只發(fā)出一條sql語句。

3、iterate()方法查詢實(shí)體對象

例子:

 
 
 
  1. Student student = (Student)session.createQuery("from Student s where s.id=1").iterate().next();  
  2.            System.out.println("student.name=" + student.getName());  
  3.               
  4.             //會發(fā)出查詢id的sql,不會發(fā)出查詢實(shí)體對象的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()); 

總共發(fā)出3條sql語句,1、2行發(fā)出兩條語句,1條是查詢實(shí)體對象的sql,另一條是查詢實(shí)體對象的name屬性,由于使用一級緩存,之前1、2行查詢的實(shí)體存放在一級緩存里面,所以5、6行利用一級緩存里面的數(shù)據(jù)只發(fā)出一條查詢id的sql。

4、iterate()方法查詢實(shí)體對象屬性(不支持一級緩存)

例子:

 
 
 
  1. String 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查詢普通屬性,一級緩存不會緩存,所以發(fā)出sql  
  5.             //一級緩存是緩存實(shí)體對象的  
  6.             name = (String)session.createQuery("select s.name from Student s where s.id=1").iterate().next();  
  7.             System.out.println("student.name=" + name); 

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

二、一級緩存是存在的,所以要更加合理的管理好,提高程序的效率,通常都是通過clear(),evict()方法來清除緩存,當(dāng)不需要使用一級緩存或者是更加高效率使用一級緩存。

如果在一次性更新或者加入數(shù)量量比較大的情況下,更加要管理好一級緩存。

例子:

 
 
 
  1. for(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.            } 

在數(shù)據(jù)量比較大的情況下管理一級緩存的做法,一般都是設(shè)定一定數(shù)量的記錄給更新或者保存等操作之后,避免一次性大量的實(shí)體數(shù)據(jù)入庫導(dǎo)致內(nèi)存溢出,所以才去先是用第8行的flush和第9行的clear方法來實(shí)現(xiàn)比較好的緩存管理。

在數(shù)據(jù)量特別大的時(shí)候,可以使用jdbc來實(shí)現(xiàn),因?yàn)閔ibernate不太適合于數(shù)據(jù)量特別大的場合使用,如果連jdbc都滿足不了數(shù)據(jù)量的效率要求,只好利用相關(guān)的數(shù)據(jù)庫機(jī)制來實(shí)現(xiàn)。


文章題目:輕松解讀Hibernate一級緩存
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/cdedjgj.html