Hibernate 一二级缓存

一级缓存(默认开启),Session缓存,会话级缓存
生命周期:就是session的生命周期,从session创建到session销毁。
一级缓存中的数据使用范围在当前session范围之内

实体类的三种状态

瞬时态 -> save() 对象里面没有id值,对象与session没有关联
持久态 ->get() 对象里面有id值,对象与session有关联
托管态 对象里面有id值,对象与session没有关联

什么是缓存

  1. 数据存到数据库里面,数据库本身就是文件系统,使用流方式操作文件效率不是很高。
    (1) 把数据存到内存当中,不需要使用流方式,可以直接读取内存中的数据
    (2) 把数据存到内存中,提高读取效率
    缓存是指为了降低应用程序对物理数据源的访问的频次,从而提高应用程序的运行性能的一种策略。
Hibernate 一二级缓存
工作原理

Hibernate缓存

  1. hibernate框架中提供很多优化方式,hibernate的缓存就是一个优化方式
  2. 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)
Hibernate 一二级缓存
持久态自动更新数据库


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()区别

  1. 返回的类型不同:

list()返回List;iterate()返回Iterate。

  1. 查询策略不同:

list()直接发送sql语句,查询数据库;

iterate()发送sql语句,从数据库取出id,然后先从缓存中根据id查找对应信息,

有就返回结果,没有就根据id发送sql语句,查询数据库。

  1. 返回对象不同:

list()返回持久化实体类对象;

iterate()返回代理对象。

  1. 与缓存的关系不同:

list()只缓存,但不使用缓存(查询缓存除外);

iterate()会使用缓存。

二级缓存(不是默认开启,需要配置)

全局缓存,应用级缓存,跟sessionFactory相关

Q:如果一些常用的数据,在一个session中缓存以后,我们希望在其他session中也能够直接使用。

Hibernate 一二级缓存
二级缓存配置

一级缓存与二级缓存的比较

Hibernate 一二级缓存
一级缓存与二级缓存的比较
Hibernate 一二级缓存
总结
上一篇:js正则表达式语法


下一篇:《编写高质量代码:改善c程序代码的125个建议》——建议16:表达式的设计应该兼顾效率与可读性