Hibernate----一級快取
1. 快取:Hibernate中也存在快取. Hibernate中存在的快取也是用來提高效率.
2. Hibernate中存在兩種快取:
1)執行緒級別的快取. Session快取
2)程序級別的快取. Hibernate 二級快取
3. session快取: 就是session物件中存在的快取.快取中存在的是(持久化)物件.
快取中的快照: 在從資料庫取得資料時, 會將資料一式兩份,一份作為快取中的物件,一份作為快照.
在session提交時作為對比.
package com.itheima.b_cache;
import org.hibernate.Session;
import org.junit.Test;
import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//session快取
public class Demo1 {
@Test
//證明session快取的存在
public void fun1(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = (User) session.get(User.class, 1);// 傳送select語句,從資料庫取出記錄.並封裝成物件
// 持久化狀態物件=> 存到快取中
User u2 = (User) session.get(User.class, 1);//再次查詢時,會從快取中查詢,不會發送select
User u3 = (User) session.get(User.class, 1);//再次查詢時,會從快取中查詢,不會發送select
System.out.println(u1==u2);//true
System.out.println(u1==u3);//true
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 遊離狀態
}
//
@Test
//session快取中的快照
public void fun2(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = (User) session.get(User.class, 1);// 傳送select語句,從資料庫取出記錄.並封裝成物件
session.update(u1);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 遊離狀態
}
@Test
//session快取中的快照
public void fun3(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = new User();
u1.setId(1);
u1.setName("jerry");
u1.setPassword("1234");
session.update(u1);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 遊離狀態
}
@Test
//感受一級快取效率的提高
public void fun4(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u1 = (User) session.get(User.class, 1);
u1.setName("tom");
session.update(u1);
u1.setName("jack");
session.update(u1);
u1.setName("rose");
session.update(u1);
//------------------------------------------------
session.getTransaction().commit();
session.close(); // 遊離狀態
}
// 持久化狀態: 本質就是存在快取中的物件,就是持久化狀態.
}