项目添加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)
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 会先从一级缓存寻找实体,未找到再从二级缓存中寻找。