概述: 用于提高hibernate执行效率。,分为两个,一级缓存和二级缓存,一级缓存,是hibernate 自带的,不可以删除.二级缓存,需要配置,一般不用hibernate提供的,而是 使用redies替代。
1. 一级缓存分为两个区,缓存区和快照区
2. 执行流程
2.1 以获取对象为例
当用户执行session.get(user.class,1L);方法的时候 会先判断缓存区中有没有这个对象,如果有的话就优先从缓存区获取,并返回。如果缓存区没有这个对象的话就从数据库中获取这个对象,并将这个对象,放置到缓存区。此时的对象,就是持久太对象。(持久态对象有两个标志:1.有OID就是有主键。2.第二个被session 管理,也就是放置到一级缓存中)当执行事务提交方法的时候, 会自动判断缓存区和快照区是否一致,如果不一致就以缓存区为标准同步。在对数据库进行更新,此时因为是获取对象,所有不会有更新或者添加操作。当执行完毕后,就会提交事务。
2.2 保存对象方法。
Session.save(sysUser); 会先将数据添加到数据库,并同时将对象添加到缓存区中。此时的对象,就是持久太对象。(持久态对象有两个标志:1.有OID就是有主键。2.第二个被session 管理,也就是放置到一级缓存中。事务提交时更新。和获取对象同理。
2.3.当持久态对象被修改。
当执行这个方法(User user= Session.get(user.classs,1l);)的时候,会获取持久态对象,此时这个对象也在一级缓存中的缓存区和快照区内。在执行这个方法:(user.setName(“张三”);)的时候,会将对象更改,同时也会更改一级缓存中的缓存区,当执行事务提交方法的时候,当执行事务提交方法的时候, 会自动判断缓存区和快照区是否一致,如果不一致就以缓存区为标准同步。在对数据库进行更新。此时数据更新完毕 ,缓存区和快照区的数据也是一致的。事务也会提交。