一,概述
Hibernate中有一级缓存与二级缓存之分,一级缓存也叫session缓存.使用缓存的目的是为了减少对数据库的访问次数,从而提升Hibernate的执行效率!
二,Hibernate中对象的状态
1)Hibernate中对象的状态:临时/瞬时状态 持久化状态 游离状态
2)临时状态
特点:直接new出来的对象,不处于session的管理,数据库中没有对应的记录.
3)持久化状态:当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态.处于持久化状态的对象,当对对象属性进行更改的时候,会反映到数据库中.
特点:处于session的管理中;数据库中有对应的记录
4)游离状态
特点:不处于session的管理;数据库中有对应的记录;session关闭后,对象的状态.
三,一级缓存
1)概念
a)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!
b)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中.
c)Session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作.
特点:只在(当前)session范围有效,作用时间短,效果不是特别明显; 在短时间内多次操作数据库,效果比较明显!
2)缓存相关几个方法的作用
session.flush(); 让一级缓存与数据库同步
session.evict(arg0); 清空一级缓存中指定的对象
session.clear(); 清空一级缓存中缓存的所有对象
3)在什么情况用上面方法?
批量操作使用使用:
Session.flush(); // 先与数据库同步
Session.clear(); // 再清空一级缓存内容
4)和session缓存有关的面试题
面试题1: 不同的session是否会共享缓存数据?
不会。
User1 u1 = Session1.get(User.class,1); 把u1对象放入session1的缓存
Session2.update(u1); 把u1放入session2的缓存
u1.setName(‘new Name’);
如果生成2条update sql, 说明不同的session使用不同的缓存区,不能共享。
面试题2: list与iterator查询的区别?
list()
一次把所有的记录都查询出来,会放入缓存,但不会从缓存中获取数据
Iterator
N+1查询; N表示所有的记录总数,即会先发送一条语句查询所有记录的主键(1),再根据每一个主键再去数据库查询(N)!会放入缓存,也会从缓存中取数据!
面试题3: get、load方法区别?
get: 及时加载,只要调用get方法立刻向数据库查询!
load:默认使用懒加载,当用到数据的时候才向数据库查询!