春季休眠ehcache设置
我有一些问题让hibernate二级缓存工作缓存域对象。根据ehcache documentation
,将缓存添加到我现有的工作应用程序中应该不会太复杂。春季休眠ehcache设置
我有以下设置(只有相关的片段进行了概述):
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE
public void Entity {
// ...
}
的Ehcache-entity.xml
<cache name="com.company.Entity" eternal="false"
maxElementsInMemory="10000" overflowToDisk="true" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="300"
memoryStoreEvictionPolicy="LRU" />
的applicationContext.xml
<bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="ds" />
<property name="annotatedClasses">
<list>
<value>com.company.Entity</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="net.sf.ehcache.configurationResourceName">/ehcache-entity.xml</prop>
<prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</prop>
....
</property>
</bean>
Maven依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.4.0.GA</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-hibernate3</artifactId>
<version>2.0.8</version>
<exclusions>
<exclusion>
<artifactId>hibernate</artifactId>
<groupId>org.hibernate</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.3.2</version>
</dependency>
个
测试类是用来使缓存统计信息:
Cache cache = cacheManager.getCache("com.company.Entity");
cache.setStatisticsAccuracy(Statistics.STATISTICS_ACCURACY_GUARANTEED);
cache.setStatisticsEnabled(true);
// store, read etc ...
cache.getStatistics().getMemoryStoreObjectCount(); // returns 0
无操作似乎触发任何缓存的变化。我错过了什么?目前我在DAO中使用HibernateTemplate
,这可能会有一些影响。
[编辑]
当设置为DEBUG唯一的Ehcache日志输出是:
SettingsFactory: Cache region factory : net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
有,我已经确定了几个原因:
-
正确Maven依赖:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.3.Final</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.4.1</version> </dependency>
从
javax.persistence
向我的实体添加了@Cacheable
注释。-
从hibernate读取日志而不是ehcache。
getSessionFactory().getStatistics().logSummary();
并非所有休眠操作似乎影响缓存。这我需要进一步阅读。
你需要手动告诉Hibernate使用的EHCache供应商?我从来不确定这是否是必需的,但Hibernate确实支持许多缓存提供程序,所以我怀疑可能需要明确告诉Hibernate需要哪一个。尝试添加此属性的applicationContext.xml:
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
感谢您的回复,根据[文档](http://ehcache.org/documentation/hibernate.html#Hibernate_3.3_and_higher),因为休眠3.3财产不应该是必要的。 – 2011-03-20 09:59:47
通过看你的配置,这一切似乎罚款AFAICT。唯一值得注意的是,当使用HibernateTemplate时,如果您计划使用查询缓存,则必须明确设置CacheQueries(true)......除非您真的需要:http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/HibernateTemplate.html#setCacheQueries(boolean)
你试过Hibernate统计而不是Ehcache的吗?你在那里得到缓存未命中吗? (原因我问的是要确保你使用相同的CacheManager如Hibernate并不)...
我不打算使用查询缓存,因此它被禁用,但感谢您的注意。我也在重构hibernatetemplate的过程中,所以我会回来的时候完成:) – 2011-03-21 16:20:46
您可以参考以下配置
<prop key="hibernate.cache.use_query_cache">true</prop>
是否日志告诉你什么时候加载XML ecache? – heldt 2011-03-19 20:40:38
@heldt,我已更新我的帖子,以包含ehcache警告 – 2011-03-19 20:44:23