首先要明确一点,并不是所有类都应该使用二级缓存,经常读取而修改比较少的类才适合使用二级缓存的,我们一定要对启用二级缓存的类分析清楚。
要使用二级缓存,主要有两步工作:
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配置文件中,对缓冲的类进行相应的设置,如下例所示:
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
name对应的是缓冲区域名,在单个SessionFactory情况下,它就是类的全路径名称,如果有前缀则加上前缀,例如:db1.auction.model.Category
etermal指的是即使过期都仍然在缓存中;
timeToIdleSeconds,对象进入缓存后,最后一次被使用后,空闲的时间间隔,超过时间即认为过期;
timeToLiveSeconds,从对象进入缓存开始算,在缓存中的存活时间,超过该时间,即认为过期;
ehcache.txt 内容如下:
log4j.txt 内容如下:-->
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=warn, stdout
#log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug
### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL
#log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug
### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug
### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug
### log cache activity ###
#log4j.logger.org.hibernate.cache=debug
### log transaction activity
#log4j.logger.org.hibernate.transaction=debug
### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug
### enable the follo