EhCache在JavaMelody中出现两次

时间:2015-02-02 11:00:45

标签: spring ehcache java-melody

在我的应用程序中,我为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出现两次以及如何删除虚拟实例?

EDITED

我还在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>

3 个答案:

答案 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的帮助下找到了解决方案。对我来说,解决方案是

  1. 要设置主spring chacheManager shared的属性true
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache.xml"/>
        <property name="shared" value="true"/>
    </bean>
  1. 要将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>