10分鐘入門Hibernate的一級緩存

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語句
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章