前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >持久化类与缓存

持久化类与缓存

作者头像
木瓜煲鸡脚
修改2019-09-17 17:10:18
7870
修改2019-09-17 17:10:18
举报
文章被收录于专栏:Jasper小笔记Jasper小笔记

持久化类与缓存

  1. 持久化
  2. 状态划分
  3. 一级缓存

1

持久化

什么是持久化?

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

什么是持久化类?

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

持久化类的编写规则?

  • 要有无参构造方法(内部通过字节码创建对象获取属性信息)
  • 私有字段要有get,set方法d
  • 对象持久化类提供一个OID与数据库表当中的主键对应(通过OID来判断是否是一个对象)
  • 属性类型尽量为包装类型
  • 持久化类不能用final修饰(会有继承)

2

持久化类三态

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

瞬时态

没有唯一的OID没有被session管理

持久态

有唯一的OID有被session管理

游离态/托管态/离线态

有唯一的OID没有被session管理

三种状态区分

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

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

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

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

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

3一级缓存

什么是缓存?

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

一级缓存

  • session级别的缓存
  • 生命周期与Session一致
  • 一级缓存是由Session中的一系列Java集合构成的
  • 是自带的, 不可卸载

二级缓存

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

一级缓存特点

代码语言:javascript
复制
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
//第一次获取,缓存中没有数据,要发送sql
Student stu = session.get(Student.class,1);
System.out.println(stu);
//再次查询同一个,缓存中已经有了无需再发送sql
Student 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方法时,缓存会被清空

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

代码语言:javascript
复制
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)

清空一个对象

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档