Hibernate的一級緩存
一、緩存的概念:
1、什麼是緩存
緩存:是一種優化的方式,將一些數據存入到內存當中,使用的時候可以直接從緩存當中獲取,不用通過存儲源。
二、Hibernate的緩存
Hibernate的框架當提供了優化的手段:緩存、抓取策略。Hibernate當中提供了兩種緩存機制:一級緩存,二級緩存。
1、Hibernate的一級緩存:
稱爲session級別的緩存、一級緩存的生命週期與session是一致的(一級緩存是由session當中的一系列的Java集合所構成的)。
一級緩存是自帶的不可卸載。
Hibernate的二級緩存是SessionFactory級別的緩存,是需要配置的緩存
2、證明Hibernate的一級緩存的存在
(1)查詢兩次發送一次數據SQL語句—》一級緩存的存在
@Test
// 證明一級緩存的存在
public void demo01() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer1 = session.get(Customer.class, 1l);//發送SQL語句
System.out.println(customer1);
Customer customer2 = session.get(Customer.class, 1l);//不發生SQL語句
System.out.println(customer2);
System.out.println(customer1 == customer2);
transaction.commit();
session.close();
}
(2)當前面使用過該對象的時候,其數據會放入到一級緩存當中,再次查詢該對象的數據,不會發送SQL語句,會直接從一級緩存對應的對象當中去獲取數據
@Test
// 證明一級緩存的存在
public void demo001() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("分解");
Serializable id = session.save(customer);//這裏會發送插入的SQL語句
//這裏不會發送SQL語句,因爲之前session當中就有Customer對象,會直接從一級緩存當中回去對應對象的值
session.get(Customer.class, id);
transaction.commit();
session.close();
}
三、Hibernate的一級緩存的內部結構
1、一級緩存中特殊的區域:快照區
2、一級緩存中的管理
沒有清空的時候,發送一次SQL語句
public void demo03() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer1 = session.get(Customer.class, 1l);//發送SQL語句查詢,同時將數據存放到一級緩存中和快照當中
Customer customer2 = session.get(Customer.class, 1l);//不發生SQL語句,會從緩存當中讀取數據
transaction.commit();
session.close();
}
發送一次SQL語句
session.close或者session.clear的時候會將緩存當中的全部數據清空
session.evict(Object obj);//清除session當中對應對象的緩存
@Test
// 一級緩存的清空
public void demo03() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer1 = session.get(Customer.class, 1l);//發送SQL語句查詢,同時將數據存放到一級緩存中和快照當中
session.clear();//清空緩存當中所有的數據,
session.evict(customer1);//清除session當中單個對象的緩存
Customer customer2 = session.get(Customer.class, 1l);//發送SQL語句查詢,同時將數據存放到一級緩存中和快照當中
transaction.commit();
session.close();
}
發送兩次SQL語句