一级缓存(默认开启),Session缓存,会话级缓存
生命周期:就是session的生命周期,从session创建到session销毁。
一级缓存中的数据使用范围在当前session范围之内
实体类的三种状态
瞬时态 -> save() 对象里面没有id值,对象与session没有关联
持久态 ->get() 对象里面有id值,对象与session有关联
托管态 对象里面有id值,对象与session没有关联
什么是缓存
- 数据存到数据库里面,数据库本身就是文件系统,使用流方式操作文件效率不是很高。
(1) 把数据存到内存当中,不需要使用流方式,可以直接读取内存中的数据
(2) 把数据存到内存中,提高读取效率
缓存是指为了降低应用程序对物理数据源的访问的频次,从而提高应用程序的运行性能的一种策略。
Hibernate缓存
- hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
- hibernate缓存特点:
第一类:hibernate的一级缓存
(1) hibernate的一级缓存是默认打开的
(2) hibernate的一级缓存使用范围,是session从创建到关闭的范围内
(3) hibernate的一级缓存中存储的数据必须是持久态的数据
第二类:hibernate的二级缓存
(1) 目前已经不再使用了,用redis代替
(2) 二级缓存默认是不打开的,需要配置
(3) 二级缓存的使用范围是sessionFactory的范围
//发送sql语句
User user=session.get(User.class,id)
//不会发送sql语句
User user=session.get(User.class,id)
持久态会自动更新数据库
User user=session,get(User.class,id)
user.setName="韩梅梅"
//事务提交的时候会自动更新数据库,不需要明显的update()操作
//session.update(user)
Imooc
session.evict(entity): 将某个对象从一级缓存中删除
session.clear(): 清除一级缓存中的所有对象
Query query=session.createQuery("from user");
List<User> list=query.list(); //会发送sql语句
//query.list()方法是不会使用到缓存的
List<User> list=query.list(); //还会发送sql语句
Iterator it=query.iterator();
while(it.hasNext()){
User user=(User) it.next();
syso(user);
}
//iterator原理: 根据query查询到实体对应的主键id列表
//如果id对应的对象数据在缓存中能找到则读取缓存
//如果id对应的数据不能在缓存中找到则发送sql语句读取数据库
query.list()和query.iterate()区别
- 返回的类型不同:
list()返回List;iterate()返回Iterate。
- 查询策略不同:
list()直接发送sql语句,查询数据库;
iterate()发送sql语句,从数据库取出id,然后先从缓存中根据id查找对应信息,
有就返回结果,没有就根据id发送sql语句,查询数据库。
- 返回对象不同:
list()返回持久化实体类对象;
iterate()返回代理对象。
- 与缓存的关系不同:
list()只缓存,但不使用缓存(查询缓存除外);
iterate()会使用缓存。
二级缓存(不是默认开启,需要配置)
全局缓存,应用级缓存,跟sessionFactory相关
Q:如果一些常用的数据,在一个session中缓存以后,我们希望在其他session中也能够直接使用。
一级缓存与二级缓存的比较