hibernate的二级缓存由第三方插件提供,比如EhCache、OsCache、SwarmCache及JBossTreeCache等,在本文中,只会对EhCache的配置作简介。
首先要明确一点,并不是所有类都应该使用二级缓存,经常读取而修改比较少的类才适合使用二级缓存的,我们一定要对启用二级缓存的类分析清楚。
要使用二级缓存,主要有两步工作:
1.为相应的类选择合并的并发策略;
2.配置第三方缓存插件。
1.并发访问策略
1.1只读(read-only): 对于永远不会被修改的数据可以采用这种并发访问策略,它的并发性能是最高的。但必须保证数据不会被修改,否则就会出错。
1.2非严格读写(nonstrict-read-write): 非严格读写不能保证缓存与数据库中数据的一致性,如果存在两个事务并发地访问缓存数据的可能,则应该为该数据配置一个很短的过期时间,以减少读脏数据的可能。对于极少被修改,并且可以容忍偶尔脏读的数据可以采用这种并发策略。
1.3读写(read-write): 读写策略提供了“read committed"数据库隔离级别。对于经常被读但很少修改的数据可以采用这种策略,它可以防止读脏数据。
1.4事务(transactional): 它提供了Repeatable Read事务隔离级别。它可以防止脏读和不可重复读这类的并发问题。
在这里,只读是性能最高的二级缓存,越往后二级缓存在性能上的提高越低。EhCache是不支持事务级的并发策略。
例如:我们指定Category类使用read-write策略
@Entity
@Table(name = "CATEGORY")
@org.hibernate.annotations.Cache(usage =
org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE
)
public class Category { ... }
2.配置第三方缓存插件
设置provider:
hibernate.cache.provider_class = org.hibernate.cache.EhCacheProvider
设置开启二级缓存:
hibernate.cache.use_second_level_cache=true
如果有多个SessionFactory,则需要设置相应的缓冲区域前缀:
hibernate.cache.region_prefix=db1
在ehcache.xml配置文件中,对缓冲的类进行相应的设置,如下例所示:
maxElementsInMemory="500"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
name对应的是缓冲区域名,在单个SessionFactory情况下,它就是类的全路径名称,如果有前缀则加上前缀,例如:db1.auction.model.Category
etermal指的是即使过期都仍然在缓存中;
timeToIdleSeconds,对象进入缓存后,最后一次被使用后,空闲的时间间隔,超过时间即认为过期;
timeToLiveSeconds,从对象进入缓存开始算,在缓存中的存活时间,超过该时间,即认为过期;
ehcache.txt
log4j.txt
阅读(1123) | 评论(0) | 转发(0) |