Hibernate中Session加载实体对象的过程

在Hibernate持久层框架中,有一级缓存和二级缓存

  • 一级缓存由Session提供的,默认总是有效的,当应用程序保存持久化实体,修改持久化实体时,Session并不会立即把这种改变提交到数据库中,而是缓存在当前的Session中,除非调用Session的flush()方法,或者通过close()方法关闭Session,通过一级缓存可以减少与数据库的交互,从而可以提高数据库访问性能
  • 二级缓存由SessionFactory提供的,是全局性的,所有Session可以共享这个二级缓存,默认是关闭的,需要显示开启并指定需要使用那种二级缓存实现类,一旦开启了二级缓存并设置了需要使用的二级缓存实现类,SessionFactory就会缓存访问过该实体类的对象,除非缓存超出了指定的缓存空间
    注意:一级缓存和二级缓存都是针对整个实体进行缓存的
  • 了解了Hibernate的一级缓存和二级缓存之后,我们接下来就来说Session加载实体类的步骤:
    1)Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,如果一级缓存中查找命中且数据状态合法,直接返回
    2)如果一级缓存没有命中,接下来Session会在当前NonExists记录(相当于一个查询黑名单如果出现重复的无效查询可以做出迅速判断,从而提升性能)中查找,如果NonExists中存在同样的查询条件,则返回null,说明之前在查询时,没有与之相对应的查询结果,就将该查询加入NonExists(黑名单)中,之后若出现相同的查询语句,直接返回null,没必要进行后期的查询了
    3)如果一级缓存查询失败则查询二级缓存,如果二级缓存中命中,这直接返回结果
    4)如果之间的查询都未命中,则发出SQL语句,如果未发现对应记录则将此次查询添加到Session的NonExists中加以记录,并返回null
    5)根据映射配置和SQL语句得到ResultSet,并创建对应的实体对象
    6)将对象纳入Session(一级缓存)的管理中
    7)如果有对应的拦截器,则执行拦截器的onLoad方法
    8)如果开启并设置了要使用二级缓存,则将数据对象纳入二级缓存中
    9)返回数据对象
    结合自己的理解以及加上网上的解释,所总结出来的,便于自己记忆
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值