JPA + EHCache 二级缓存

来源:互联网 发布:人工智能5.4ppt 编辑:程序博客网 时间:2024/04/27 17:33
项目添加JPA二级缓存功能:


1、在pom.xml里添加hibernate-ehcache依赖,添加后会自动添加ehcache-core包。
<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>4.2.2.Final</version>
        </dependency>
2、修改persistence.xml文件
   a、添加<provider>org.hibernate.ejb.HibernatePersistence</provider>
        
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
   b、添加属性
<!-- 二级缓存 -->
        <property name="hibernate.cache.region.factory_class" 
            value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
      <property name="hibernate.cache.provider_configuration_file_resource_path" value="ehcache.xml" />
      <property name="cache.use_second_level_cache" value="true"/> 
      <property name="hibernate.cache.use_query_cache" value="true"/> 
3、在src/main/resources目录下添加ehcache.xml
除defaultCache、org.hibernate.cache.spi.UpdateTimestampsCache、org.hibernate.cache.internal.StandardQueryCache外还需添加
<!-- 单独对某个entity的缓存策略设置 -->
<cache name="com.zjy.demo.domain.Account" maxElementsInMemory="100"
eternal="false" timeToIdleSeconds="1200" timeToLiveSeconds="1200"
overflowToDisk="false" clearOnFlush="true">
</cache>
4、实体上添加注解
@Entity
@Cacheable(true)
public class Account {}
5、查询时需要添加uery.setHint("org.hibernate.cacheable", true);
Query query = em.createQuery("from Account");
query.setHint("org.hibernate.cacheable", true);
return (List<Account>)query.getResultList();

或者使用Criteria
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Account> cq = cb.createQuery(Account.class);
Root<Account> root = cq.from(Account.class);
Query query = em.createQuery(cq);
query.setHint("org.hibernate.cacheable", true);
return (List<Account>)query.getResultList();


6、清除缓存时
em.getEntityManagerFactory().getCache().evictAll();






如果使用Hibernate的缓存,需要第4步将@Cacheable替换为@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

但清除缓存的时候需要使用session获得Cache


补充:

缓存的方式有四种,分别为: 
  CacheConcurrencyStrategy.NONE 
  CacheConcurrencyStrategy.READ_ONLY,只读模式,在此模式下,如果对数据进行更新操作,会有异常; 
  CacheConcurrencyStrategy.READ_WRITE,读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询; 
  CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不严格的读写模式则不会的缓存数据加锁; 
  CacheConcurrencyStrategy.TRANSACTIONAL,事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持JTA环境。




如果二级缓存激活,JPA 会先从一级缓存寻找实体,未找到再从二级缓存中寻找。



0 0
原创粉丝点击