Hibernate中的一级缓存
1、什么是缓存?
缓存是一种优化的方式,将数据存入内存中,使用的时候直接从缓存中获取,不用通过存储源。
2、Hibernate框架中提供了很多优化手段:缓存、抓取策略。
Hibernate中提供了2种缓存机制:一级缓存、二级缓存。
一级缓存是Session级别的,自带的。
二级缓存是SessionFactory级别的,需要手动去配置。
3、什么是Hibernate的一级缓存?
Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象。
在使用Hibernate查询对象的时候,首先会使用对象属性的OID值去Hibernate的一级缓存中进行查找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库。
如果没有找到相同OID值的对象,则会去数据库中查找相应数据。当从数据库中查询到所需数据时,该数据信息也会放置到一级缓存中。
4、Hibernate的一级缓存的作用:
为了减少对数据库的访问次数。
5、一级缓存的组成:
Session接口的实现中包含一系列的java集合,这些java集合构成了Session缓存,也就是一级缓存。
6、一级缓存的生命周期:
只要Session实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期。
故一级缓存是依赖着Session对象的,一级缓存也被称为Session级别的缓存。
7、Hibernate一级缓存的特点:
当应用程序调用Session接口的sava()、update()、saveOrUpdate()时,如果Session缓存中没有相应的对象,Hibernate就会自动的把从数据库中查询到的相应对象信息加入到一级缓存中去。
当调用Session接口的get()/load()方法,以及Query接口的list(),iterator()方法时,会判断一级缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询的对象,再去数据库中查询相应对象,并添加到一级缓存中。
当调用Session的close(),clear()方法时,Session的缓存会被清空。
8、一级缓存中特殊区域:快照区
相当于对象上次保存数据的照片。
当一级缓存区中的数据发生改变,此时会和快照区的数据进行对比,如果不一样则更新数据库。
9、证明一级缓存的存在
测试代码:
package com.pipi.hibernate02;
import com.pipi.hibernate.User;
import myutils.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;
// 证明一级缓存的存在:
// 2种方式证明:两次取,也可以先存再取。
public class Test03 {
public static void main(String[] args) {
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
// 第一次查询,先去一级缓存中查找,没有再去数据库中查询,并把查询到的对象添加到缓存中
User user1 = session.get(User.class, 1); // 会执行相应的sql语句
// 第二次查询,会去一级缓存中查询
User user2 = session.get(User.class, 1); // 不会执行sql语句
System.out.println(user1); // User{id=1, username='张三', password='abc123'}
System.out.println(user2); // User{id=1, username='张三', password='abc123'}
// 判断这两个对象的内存地址,即判断是不是同一个对象
System.out.println(user1 == user2); // true
transaction.commit();
session.close();
}
}