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语句
在这里插入图片描述

原创文章 76 获赞 151 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/105738779