持久化类与缓存

#2020云栖大会#阿里云海量offer来啦!投简历、赢阿里云限量礼品及阿里云ACA认证免费考试资格!>>> hot3.png

持久化类与缓存


8c6792febcf7d53dd2ce21c2fe7452f1dfe.png


  1. 持久化

  2. 状态划分

  3. 一级缓存



1 持久化 268080941da9532ec46850e9b467fa3f845.gif

什么是持久化?


将内存中的对象持久化到本地(以数据库保存下来)的过程



什么是持久化类?


和数据库表建立映射的java类(java类+映射文件)



持久化类的编写规则?


  • 要有无参构造方法(内部通过字节码创建对象获取属性信息)


  • 私有字段要有get,set方法d


  • 对象持久化类提供一个OID与数据库表当中的主键对应(通过OID来判断是否是一个对象)


  • 属性类型尽量为包装类型


  • 持久化类不能用final修饰(会有继承)

268080941da9532ec46850e9b467fa3f845.gif



2 持久化类三态 268080941da9532ec46850e9b467fa3f845.gif


Hibernate为了更好的管理持久化类,将持久化类对象分为三种状态

瞬时态

没有唯一的OID

没有被session管理

持久态

有唯一的OID

有被session管理

游离态/托管态/离线态

有唯一的OID

没有被session管理


三种状态区分


ea56fafce3395a0e13a07958a3619643e81.png

瞬时态:刚new出对象时,还没有设置id,还没有被session所管理


持久态:已经有了id,调用session方法,把对象给session,才被session所管理,添加到session之后, 对象一直处理持久态,当对象处理持久态时, 可以自动更新数据库


游离态:把session关闭掉时close时,对象处理游离态



持久态特性(原理:依赖于一级缓存)

Session session = HibernateUtil.openSession();//开启事务Transaction transaction = session.beginTransaction();//获取持久态对象Student stu = session.get(Student.class,1);//不用update,持久态下能自动更新stu.setName(“王五”);transaction.commit();


268080941da9532ec46850e9b467fa3f845.gif



3 一级缓存 268080941da9532ec46850e9b467fa3f845.gif

什么是缓存?


是一种优化的方式,将数据存入到内存当中,使用的时候直接从缓存中获取,不用直接到存储源中取数据了



一级缓存


  • session级别的缓存

  • 生命周期与Session一致

  • 一级缓存是由Session中的一系列Java集合构成的

  • 是自带的, 不可卸载



二级缓存


是SessionFactory级别的缓存,需要自己去配置,默认是开启的,在企业当中一般都不用了,现在都redis



一级缓存特点


Session session = HibernateUtil.openSession();Transaction transaction = session.beginTransaction();//第一次获取,缓存中没有数据,要发送sqlStudent stu = session.get(Student.class,1);System.out.println(stu);//再次查询同一个,缓存中已经有了无需再发送sqlStudent stu1 = session.get(Student.class,1);System.out.println(stu);//同一个对象System.out.println(stu == stu1);transaction.commit();

当使用Session接口的Save()、update()、saveOrUpdate()时,如果session缓存中没有相应的对象,就会自动的从数据库查询相应的信息,写到缓存当中


当调用Session接口的load,get()方法,以及Query接口的list iterator方法时, 会判断缓存中是否存在该对象,有则返回, 不会查询数据库,如果缓存中没有要查询的对象,再到数据库当中查询对应的对象,并添加到一级缓存中


当调用session.close方法时,缓存会被清空



持久态为什么可以自动更新?

Session session = HibernateUtil.openSession();//开启事务Transaction transaction = session.beginTransaction();//获取持久态对象Student stu = session.get(Student.class,1);//不用update,持久态下能自动更新stu.setName(“王五”);transaction.commit();

在缓存区中还有一个快照区,按前面的所说,当对象由session管理时将对象存入缓存,除此之外还会复制一份到快照区。我们再获取使用这个对象时是从缓存当中获取,并且设置了新的值,但快照是不变的是最开始创建缓存的复制,当事务提交时会对比缓存中和快照中对应的对象是否一样,若不一样则发送update语句修改。



清空缓存


clear()清空所有缓存
evict(obj)清空一个对象



268080941da9532ec46850e9b467fa3f845.gif




db7150a74310a7ac0c3205bf8e4cc2d36e6.png 9a5fdba60e094ab6cca55cad47a371387ab.jpg

它,

不仅仅是一个码


本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值