Hibernate缓存概述

14 篇文章 0 订阅
3 篇文章 0 订阅
Hibernate的一级缓存:Session的缓存和SessionFactory的内置缓存,不可卸载。
Hibernate的二级缓存:SessionFactory的外置缓存,可插拔。

一)Session的缓存
Session缓存中存放的是数据库中数据的拷贝,在DB中表现为关系数据形式,而在Session缓存中表现为互相关联的对象。在读写DB时,Session会负责这两种数据形式的映射。

Session接口是Hibernate向应用程序提供操作数据库的最主要接口,它提供了基本的保存、更新、删除和查询的方法。Session具有一个缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中持久化对象的属性变化来同步数据库,这一过程称为清理缓存。

Session缓存的实现原理
Session缓存是由它的实现类SessionImpl中定义的一些集合属性构成的,原理是保证有一个引用在关联着某个持久化对象,保持它的生命周期不会结束。

Session缓存的作用
[1]减少DB访问频率。
应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据要快得多了,所以Session的缓存可以提高数据访问性能。
[2]保证缓存中对象与DB数据同步。
位于缓存中的对象被称为持久化对象,当患粗重之久化对象的状态发生了变换,Session并不会立即执行相关SQL语句,这使得Session能够把几条相关的SQL居于合并为一条SQL语句,以便较少DB访问次数,提高效率。
[3]当缓存中的持久化对象之间存在循环关联关系是,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。

Session何如清理缓存
[1]按照调用session.save()方法的先后顺序,执行所有对实体进行插入的insert语句。
[2]执行所有对实体进行更新的update语句。
[3]执行所有对集合进行删除的delete语句。
[4]执行所有对集合元素进行删除、更新、插入的SQL语句。
[5]执行所有对集合进行插入的insert语句。
[6]按照调用session.delete()的先后顺序,执行所有对实体进行删除的delete语句。

Session清理缓存的时间点
Session通过setFlushMode()方法来设置清理缓存的时间点。FlushMode类定义了三种不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT、FlushMode.NEVER
无论设置为哪种FulshMode,当session.flush()时,都会清理缓存。
若设置为FulshMode.NEVER,则即便transaction.commit()也不清理缓存,只能通过session.flush()来清理。
若设置为FulshMode.AUTO,则session.find(),session.iterate()(),transaction.commit(),session.flush()都将清理缓存。
所以,优先考虑使用FlusthMode.AUTO,这也是默认值。这也就是说大部分时候,无须手动执行session.flush()。

二)SessionFactory的内置缓存
与Session的缓存类似,SessionFactory的内置缓存中存放了映射元素数据和预定义的SQL语句,预定义SQL是在Hibernate初始化阶段根据映射数据推导出来的。
 
三)SessionFactory的外置缓存
默认情况下Hibernate不启动这个缓存插件。
这是一个可配置的缓存,即本此讨论的二级缓存,是进程或群集范围内的缓存,缓存中存放的对象是散装数据。Hibernate允许选用以下类型的缓存插件:
EHCache:
OpenSymphony OSCache:
SwarmCache:
JBossCache:
这四种缓存插件都是由第三方提供的,为了把这些缓存插件集成到Hibernate中,Hibernate提供了CacheProvider接口,同时内置了CacheProvider的四种实现:
EhCacheProvider
OSCacheProvider
SwarmCacheProvider
TreeCacheProvider
这四个Provider分别与四个缓存插件一一对应。
 
使用二级缓存一定要注意并发访问策略,在<class>和<set>中都有<cache>子元素来设置并发访问策略。具体配置参照Hibernate文档即可。
 
另外,基本每个插件都有自己的配置文件,具体配置需要参考该插件的技术文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值