Hibernate 一二级缓存

简介: 一级缓存(默认开启),Session缓存,会话级缓存生命周期:就是session的生命周期,从session创建到session销毁。一级缓存中的数据使用范围在当前session范围之内实体类的三种状态瞬时态 -> save() 对象里面没有id值,对象与session没有关联持久态 ->get() 对象里面有id值,对象与session有关联托管态 对象里面有id值,对象与session没有关联什么是缓存数据存到数据库里面,数据库本身就是文件系统,使用流方式操作文件效率不是很高。

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

实体类的三种状态

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

什么是缓存

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

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)
img_75562641197a15cf21060c7ddcfb5346.png
持久态自动更新数据库


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中也能够直接使用。

img_76e186fbb70091914a0c9ebdc48749f4.png
二级缓存配置

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

img_de946767e94c72b01b929f989f49ab17.png
一级缓存与二级缓存的比较
img_6ec9d31224fd5c934637eb1c214a8d67.png
总结
目录
相关文章
|
3月前
|
缓存 NoSQL Java
揭秘性能提升的超级武器:掌握Hibernate二级缓存策略!
【9月更文挑战第3天】在软件开发中,性能优化至关重要。使用Hibernate进行数据持久化的应用可通过二级缓存提升数据访问速度。一级缓存随Session生命周期变化,而二级缓存是SessionFactory级别的全局缓存,能显著减少数据库访问次数,提高性能。要启用二级缓存,需在映射文件或实体类上添加相应配置。然而,并非所有场景都适合使用二级缓存,需根据业务需求和数据变更频率决定。此外,还可与EhCache、Redis等第三方缓存集成,进一步增强缓存效果。合理运用二级缓存策略,有助于大幅提升应用性能。
103 5
|
4月前
|
缓存 Java 数据库连接
Hibernate 中的查询缓存是什么?
【8月更文挑战第21天】
43 0
|
4月前
|
存储 缓存 Java
|
4月前
|
存储 缓存 Java
Hibernate 中默认启用二级缓存吗?
【8月更文挑战第21天】
41 0
|
4月前
|
存储 缓存 Java
Hibernate 中的二级缓存是什么?
【8月更文挑战第21天】
48 0
|
4月前
|
缓存 Java 数据库连接
Hibernate 中的一级缓存是什么?
【8月更文挑战第21天】
57 0
|
7月前
|
缓存 Java 数据库连接
hibernate二级缓存
在配置和使用Hibernate二级缓存时,你应该根据应用的需求和性能要求,合理选择缓存提供者和配置参数,以达到性能优化的目的。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
69 1
|
7月前
|
缓存 Java 数据库连接
Hibernate或MyBatis:ORM映射、缓存机制等知识讲解梳理
Hibernate或MyBatis:ORM映射、缓存机制等知识讲解梳理
134 0
|
7月前
|
缓存 Java 数据库连接
Hibernate - 查询缓存和时间戳缓存区域使用详解
Hibernate - 查询缓存和时间戳缓存区域使用详解
83 0
|
7月前
|
SQL 缓存 Java
Hibernate - 整合Ehcache二级缓存使用详解
Hibernate - 整合Ehcache二级缓存使用详解
77 0