hibernate之高速缓存基本原理(Hibernate高速缓存架构)
就像我们前面提示过的,hibernate有一个两级的高速缓存架构。
. 一级高速缓存是持久化上下文高速缓存。一个Hibernate session的寿命相当于单个请求(通常用一个数据库事务实现)或者单个对话。这是个强制的一级高速缓存,它保证对象的范围和数据库同一性;
. hibernate中的二级高速缓存是可插拔的,并且可以被界定到过程或者集群。这是一个状态的高速缓存(按值返回),而不是实际的持久化实例的高速缓存。高速缓存并发策略给特定的数据项目定义了事务隔离细节,而高速缓存提供程序表示了物理高速缓存实现。
. hibernate也给与二级高速缓存密切整合的查询结果集实现高速缓存。这是个可选的特性;它需要两个额外的物理高速缓存区域,当表最后一次被更新时保存被高速缓存的查询结果和时间戳。
----------
1.hibernate二级高速缓存
hibernate的二级高速缓存有过程或者集群范围:已经从特定的SessionFactory开始的所有持久化上下文共享同一个二级高速缓存。
持久化实例以分解的形式保存在二级高速缓存中。把分解过程当作一个过程,有点像序列化(但这个算法比算法比java序列化)。
二级高速缓存在一个单独的类或者集合角色的粒度中是可配置的。例如,让你为引用数据类启用二级高速缓存,并对表示财务记录的类禁用它。这个高速缓存策略涉及如下设置:
. 二级高速缓存是否被启用。
. hibernate并发策略。
. 高速缓存过期策略(如超时,LRU和内存敏感性)。
. 高速缓存物的物理格式(内存,被索引的文件,集群复制)
并非所有的类都受益于高速缓存,因此能够禁用二级高速缓存很重要。重申一下,高速缓存通常只对主要用来读取的类有用。如果你有更新比读取更经常的数据,就不要启用二级高速缓存。即使所有其他的高速缓存条件都符合!更新期间维护高速缓存的代价可能远远超出更快读取的性能受益。此外,二级高速缓存在与其他的写入应用程序共享数据库的系统中可能很危险。如前几节所述,你在这里必须给想要启用高速缓存的每个类和集合进行小心的判断。
hibernate二级高速缓存的创建分两步。首先,必须决定使用哪种并发策略。之后,利用高速缓存提供程序配置高速缓存过期和物理高速缓存属性。
----------
2.内建的并发策略
并发策略是一个媒介:它负责在高速缓存中保存数据的项目,并从高速缓存中获取它们。这是个重要的角色,因为它也为特定的项目定义了事务隔离语义。如果想要启用二级高速缓存,就必须给每个持久化类和集合决定使用哪种并发策略。
下面4个内建的并发策略表示递减的事务隔离方面的严格级别:
. 事务---只可用于托管环境,如有必要,它还保证完全的事务隔离直到可重复读取。给主要用于读取的数据使用这种策略,因为在这种数据中,防止并发事务中的废弃数据最为关键,极少数情况下用于更新。
. 读/写---这种策略利用时间戳机制,维护读取提交隔离,并且只在非集群环境中可用。还是给主要用于读取的数据使用这种策略,因为在这种数据中防止并发事务中的废弃数据最为关键,极少数情况下用于更新。
. 非严格读/写---不提供高速缓存和数据库之间的一致性保证。如果有可能并发访问相同的实体,你应该配置一个足够短的超时期限。否则,则可能从高速缓存中读取废弃的数据。如果数据几乎不变(几个小时,几天或者甚至一周),并且废弃的数据不可能是关键的关注点,那就使用这种策略。
. 只读---并发策略适合于从不改变的数据。它只用于引用数据。
注意,递减的严格性带来了性能的递增。在把它用在产品中之前,必须小心评估包含完整事务隔离的集群高速缓存的性能。在许多情况下,如果绝不考虑废弃的数据,可能最好给特定的类禁用二级高速缓存!首先以禁用了二级高速缓存的应用程序为基准。为好的备选类启用它,一次一个,同时继续测试系统的可伸缩性,并评估并发策略。
----------
3.选择高速缓存提供程序
考虑了要给高速缓存的备选类使用的并发策略之后,下一步就是挑选高速缓存提供程序。
现在, hibernate强制你给整个应用程序选择单个的高速缓存提供程序。hiberante内建了以下开源产品的提供程序:
. EHCache是特意用于单个JVM中简单的过程范围高速缓存的高速缓存提供程序。它可以高速缓存在内存或者磁盘中,并支持可选的hibernate查询结果高速缓存。(EHCache的最新版本现在支持被集群的高速缓存,但我们还没有对它进行过测试。)
.OSCache是一项服务,它通过一组丰富的过期策略和查询高速缓存支持,支持在单个JVM中高速缓存到内存和磁盘。
.SwarmCache是基于JGroups的集群高速缓存。它使用集群的失效,但不支持Hibernate查询高速缓存。
.JBoss Cache是一个完全事务复制的集群高速缓存,也基于JGroups多播库。它支持复制或者失效、同步或者不同步的通信,以及乐观锁和悲观锁。支持Hibernate查询高速缓存。
并非每个高速缓存提供程序都可以与每一种并发策略兼容!下面的表将帮助你选择一种适当的组合:
并发策略高速缓存提供程序 只读 非严格读/写 读/写 事务
EHCache Y Y Y N
OSCache Y Y Y N
SwarmCache Y Y N N
JBossCache Y N N Y
创建高速缓存涉及两个步骤:首先,在映射元数据中看看持久化类和集合,并决定要给每个类和每个集合使用哪种高速缓存并发策略。然后,在全局的hibernate配置中启用首选的高速缓存提供程序,并定制提供程序特定的设置和物理高速缓存区域。例如,如果正在使用OSCache,就编辑oscache.properties,或者给EHCache编辑类路径中的ehcache.xml。