看下面例子,就很快明白了
連續查詢兩次
public void testLoad(){
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
System.out.println("1.student Name:"+s.getName());
Student s1 = (Student)session.load(Student.class, 1);
System.out.println("2.student Name:"+s1.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 代碼分析
- 隻執行一次sql語句:第一次load查詢後放于緩存,第二次load查詢會先看下緩存有沒有,如果有的話,從緩存中擷取資料
先添加,再查詢
public void testAdd2(){
Student s1 = new Student();
s1.setName("Jack");
s1.setScore(90);
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(s1);
Student s2 = (Student)session.load(Student.class, 2);
System.out.println("2.student Name:"+s2.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 代碼分析:
- 隻執行一條添加sql語句:save的時候先往緩存session裡放(此時沒有id),然後再往資料庫裡插入資料,再把id放到session裡。然後查詢的時候先檢視緩存裡有沒有id為2的資料,如果有就直接擷取
先查詢,然後關閉session,再查詢:
public void testLoad2(){
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
System.out.println("1.student Name:"+s.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
System.out.println("1.student Name:"+s.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 代碼分析:
- 執行兩條sql語句,session關閉後,緩存資料也沒有了,需要再到資料庫查詢。這就是一級緩存