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语句