Hibernate 一二级缓存

简介: Hibernate 一二级缓存

一级缓存(默认开启),Session缓存,会话级缓存


生命周期:就是session的生命周期,从session创建到session销毁。

一级缓存中的数据使用范围在当前session范围之内


实体类的三种状态



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

持久态 ->get() 对象里面有id值,对象与session有关联

托管态 对象里面有id值,对象与session没有关联


什么是缓存



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


image.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)


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


image.png


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


image.png


image.png

相关文章
|
14天前
|
缓存 Java 数据库连接
hibernate二级缓存
在配置和使用Hibernate二级缓存时,你应该根据应用的需求和性能要求,合理选择缓存提供者和配置参数,以达到性能优化的目的。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
16 1
|
5月前
|
SQL 缓存 Java
Hibernate - 整合Ehcache二级缓存使用详解
Hibernate - 整合Ehcache二级缓存使用详解
29 0
|
7月前
|
缓存 Java 数据库连接
mybatis之一级缓存和二级缓存~
mybatis之一级缓存和二级缓存~
|
9月前
|
存储 SQL 缓存
mybatis中一级缓存和二级缓存
mybatis中一级缓存和二级缓存
66 0
|
SQL 存储 缓存
hibernate的一级缓存
hibernate的一级缓存
88 1
hibernate的一级缓存
|
SQL 缓存 JavaScript
Hibernate的一级缓存
缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取.
99 0
Hibernate的一级缓存
|
缓存 Java 数据库连接
Hibernate的一级缓存和二级缓存(七)
Hibernate的一级缓存和二级缓存(七)
133 0
Hibernate的一级缓存和二级缓存(七)