文章目录
回收内存的方式
空引用会被回收内存
在java当中,空引用会被Java的垃圾回收机制回收掉。
对象在实例化时候会分配空间,即第三行才会分配空间。把内存堆区首地址赋值给C1
第4行时候也是赋值那个地址给C2;
第5行时候才会创建一个新的对象,赋新地址值给C2;
隔离引用会被回收内存
User对象里有个订单集合类型的属性。
缓存
缓存的作用就是减轻永久性存储源(在这里值数据库)的压力
Session缓存
内部实现就是通过内部接口一直引用。
让一个集合类型的引用一直存在。
实质就是把对象放集合当中
SessionFactory.openSession();初始化session对象,初始化Session。
Session查询时先看缓存,没有了才看数据库
调用get,save方法时候都是在缓存当中
清理 != 清空
清理=让缓存数据与数据库数据一致
按照Session缓存同步更新数据库
Session.flush();清理缓存,会被roulBack回滚事务
Session.close();会永久提交,不会被回滚
Load与get方法不会清理缓存,get与load方法是去读取缓存的。
会先判断缓存,所以不会读取数据库,不会读到数据库的脏数据(错误数据)
Session快照
save方法会把数据放到缓存,并且在缓存中建立备份(快照)
清理缓存时候会判断缓存中的数据与快照是否一致,不一致的话就会更新新数据到数据库
Menual:手动清理缓存,commit方法不在执行清理
COMMIT:适用于查询比较多,数据不太安全
Session缓存作用
堆栈溢出异常
不会创建新对象,二而是OID赋值;
Hibernate对象的生命周期
实体对象的生命周期
临时-》持久化-》游离-》删除
临时对象特定:缓存有记录,数据表无记录对应
持久化特点:数据库有记录,缓存也存在对应
游离对象特点:数据库可能有记录,但是缓存没有对应
被删除对象特点:不在缓存,并且计划删除数据库记录。
close方法会清空缓存对象并且修改缓存标志位(标识是否Session可用)
clean方法仅清空缓存
除了持久化状态吗不会被回收,其他状态都可能被回收,因为持久化状态肯定有引用。
Hibernate操作持久化对象
Session的Save()
Session的update()
可以通过第四小点的标签实现与快照一致时不更新数据库
但是会多一个查询数据库的操作,所以一般不用。
Session的saveOrUpdate()
默认情况,属性只要OID=null,就是临时对象
前提是引用的对象
Session的delete方法