在我的应用程序中,我为EhCache包含了以下xml配置(ehcache-core版本2.4.3)
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="false"
monitoring="autodetect"
dynamicConfig="true">
<defaultCache
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="0">
</defaultCache>
<cache name="MyParamsCache"
eternal="true"
overflowToDisk="true"
diskSpoolBufferSizeMB="20"
memoryStoreEvictionPolicy="LRU"
statistics="true">
</cache>
</ehcache>
缓存管理器声明为
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcache" />
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml" />
</bean>
使用bean我将参数添加到此缓存中(通过在Spring中自动装配cacheManager)。应用程序中没有错误,但是当我检查JavaMelody中的缓存(数据内容部分)时,我看到MyParamsCache
出现两次。一个实例充满了内容,而另一个实例是空的。
有谁知道为什么MyParamsCache
出现两次以及如何删除虚拟实例?
我还在persistence.xml中使用hibernate二级缓存。在那里再次创建缓存bean,而不是使用已存在的缓存bean。代码是
<persistence-unit name="myPU">
.....
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
</properties>
</persistence-unit>
答案 0 :(得分:0)
问题解决了文件ehcache.xml在META-INF文件夹中移动。 Bean声明更新为
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:META-INF/ehcache.xml" />
</bean>
答案 1 :(得分:0)
我可以通过添加ehcache作为依赖于entityManagerFactory
来解决问题 <bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory"
depends-on="ehCache">
在persistence.xml中配置了
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />
我会对如何在不使用SingletonEhCacheRegionFactory的情况下实现这一目标的建议感兴趣。
答案 2 :(得分:0)
我将此问题发布在https://github.com/javamelody/javamelody/issues/932上,并在https://github.com/evernat的帮助下找到了解决方案。对我来说,解决方案是
shared
的属性true
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
<property name="shared" value="true"/>
</bean>
SingletonEhCacheProvider
用作hibernate.cache.provider_class
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.SingletonEhCacheProvider</prop>