1)Hibenate中一级缓存,也叫作session的缓存,它能够在session范围内减小数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效!面试
2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。 sql
3)Session的缓存由hibernate维护, 用户不能操做缓存内容; 若是想操做缓存内容,必须经过hibernate提供的evit/clear方法操做。数据库
特色:缓存
只在(当前)session范围有效,做用时间短,效果不是特别明显!session
在短期内屡次操做数据库,效果比较明显!spa
缓存相关几个方法的做用hibernate
session.flush(); 让一级缓存与数据库同步对象
session.evict(arg0); 清空一级缓存中指定的对象get
session.clear(); 清空一级缓存中缓存的全部对象同步
在什么状况用上面方法?
批量操做使用使用:
Session.flush(); // 先与数据库同步
Session.clear(); // 再清空一级缓存内容
面试题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)!
会放入缓存,也会从缓存中取数据!