开篇先写结论:
Hibernate4 想使用 ehcache 时做二级缓存时,不使用 EHCache 提供的:
hibernate.cache.region.factory_class
请无视 EHcache 网站上的 document , 那是针对 Hibernate 3.X 的.
Hibernate 4.X 有自己对其他 Cache 框架的支持.
PS: 如果按照原来方式配置,可能会出现以下异常:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/cache/TimestampsRegion
Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.EntityRegion
导入<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />就报错 :说找不到
org.springframework.cache.ehcache.EhCacheManagerFactoryBean这个
原因是少了spring-context-support.jar 这个包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
spring4.x hibernate4.x 整合 ehcache 基于 注解 annotate
废话不说 直接贴源码链接 : https://git.oschina.net/alexgaoyh/alexgaoyh.git
使用ehcache来提高系统的性能,现在用的非常多, 也支持分布式的缓存,在hibernate当中作为二级缓存的实现产品,可以提高查询性能。
pom.xml
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-ehcache</artifactId>
- <version>4.1.6.Final</version>
- </dependency>
在项目的src下面添加ehcache的配置文件ehcache.xml
- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
-
-
-
- <diskStore path="java.io.tmpdir"/>
-
- <!--
- Mandatory Default Cache configuration. These settings will be applied to caches
- created programmtically using CacheManager.add(String cacheName)
- -->
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- maxElementsOnDisk="10000000"
- diskPersistent="false"
- diskExpiryThreadIntervalSeconds="120"
- memoryStoreEvictionPolicy="LRU"
- />
-
- <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
- maxElementsInMemory="5000"
- eternal="true"
- overflowToDisk="true" />
- <cache name="org.hibernate.cache.internal.StandardQueryCache"
- maxElementsInMemory="10000"
- eternal="false"
- timeToLiveSeconds="120"
- overflowToDisk="true" />
-
- <!--
- java文件注解查找cache方法名的策略:如果不指定java文件注解中的region="ehcache.xml中的name的属性值",
- 则使用name名为com.lysoft.bean.user.User的cache(即类的全路径名称), 如果不存在与类名匹配的cache名称, 则用 defaultCache
- 如果User包含set集合, 则需要另行指定其cache
- 例如User包含citySet集合, 则也需要
- 添加配置到ehcache.xml中
- -->
- <cache name="javaClassName" maxElementsInMemory="2000" eternal="false"
- timeToIdleSeconds="120" timeToLiveSeconds="120"
- overflowToDisk="true" />
-
- </ehcache>
在spring 集成hibernate 的配置文件中,添加如下配置
-
- <prop key="hibernate.cache.use_query_cache">true</prop>
-
- <prop key="hibernate.cache.use_second_level_cache">true</prop>
-
-
- <prop key="hibernate.cache.region.factory_class">
- org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
- </prop>
Spring也使用ehcache, 所以也需要在spring配置文件中添加ehcache的配置
-
- <bean id="cacheManagerEhcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
- <property name="configLocation">
- <value>classpath:ehcache.xml</value>
- </property>
-
- <property name="shared" value="true"/>
- </bean>
在类中定义:
- @Entity
- @Table(name = "t_user")
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="javaClassName")
- public class User implements Serializable {
-
- }
默认情况下二级缓存只会对load get 之类的方法缓存, 想list iterator 之类的方法也使用缓存 必须跟查询缓存一起使用, 重写查询方法
- criteria.setCacheable(true).list();
之后进行验证