{传智播客} (学习笔记)--Hibernate的Session缓存问题与理解

今天学了hibernateSession缓存,对缓存、内存、java对象的状态等这几个概念及其联系还处于迷糊状态,查了相关资料,理清了一下思路。

 

   Hibernate Session缓存被称为Hibernate的第一级缓存。SessionFactory的外置缓存称为Hibernate的二级缓存。这两个缓存都位于持久层,它们存放的都是数据库数据的拷贝。SessionFactory的内置缓存 存放元数据和预定义SQL SessionFactory的内置缓存是只读缓存。

 

问题一:Session缓存和内存什么关系?

Java里,缓存通常指Java对象的属性占用的内存空间,通常是一些集合类型的属性。如果对象的占用的内存很大就称为重量级的对象。如果对象的内存小就称为轻量级的对象。

 

 

问题二:java对象的在内存中有哪些状态?

临时状态(transient):刚刚用new语句创建,没有被持久化,不处于session缓存中,跟任何session都不关联,数据库没有对应记录。

持久化状态(persistent):该对象已经被持久化,加入到session的缓存中,并且和数据库中一条记录相对应。 

游离状态(detached):该对象已经被持久化,但不处于session中。它与临时对象最大的区别在于数据库还可能存在一条记录与之对应。      

 

状态变换图如下:

 

 状态转换图

 

问题三:Session 如何判断持久化对象的状态的改变呢?

Session 加载对象后会为对象值类型的属性复制一份快照。当Session 清理缓存时,比较当前对象和它的快照就可以知道那些属性发生了变化。

 

问题四:什么叫做清理缓存?

Session能够在某些时间点,按照缓存中的持久化对象的属性变化来同步更新数据库,这一过程被称为清理缓存。

参考资料:当 应用程序调用Sessionsave()update()savaeOrUpdate()get()load(),以及调用查询接口的 list()iterate()filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一 级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象。(互动百科中hibernate介绍)

 

问题五:Session 什么时候清理缓存?

1commit() 方法被调用时。

2、查询时会清理缓存,保证查询结果能反映对象的最新状态。

3、显示的调用session flush方法。

session 清理缓存的特例:

当对象使用 native 生成器 会立刻清理缓存向数据库中插入记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值