EhCache + Hibernate Cache没有活着

时间:2011-10-04 10:42:32

标签: hibernate caching ehcache second-level-cache

将EhCache v2.4.5配置为hibernate v3.6.7的二级缓存后,在尝试使用hibernate会话加载特定实体的所有对象时出现以下错误。 (第一次加载对象没有错误)

java.lang.IllegalStateException: The country Cache is not alive.
at net.sf.ehcache.Cache.checkStatus(Cache.java:2438)
at net.sf.ehcache.Cache.get(Cache.java:1541)
at net.sf.ehcache.hibernate.regions.EhcacheTransactionalDataRegion.get(EhcacheTransactionalDataRegion.java:105)
at net.sf.ehcache.hibernate.strategy.AbstractReadWriteEhcacheAccessStrategy.putFromLoad(AbstractReadWriteEhcacheAccessStrategy.java:90)
at net.sf.ehcache.hibernate.nonstop.NonstopAwareEntityRegionAccessStrategy.putFromLoad(NonstopAwareEntityRegionAccessStrategy.java:180)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:195)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:982)
at org.hibernate.loader.Loader.doQuery(Loader.java:857)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at dataAccess.CountryDAO.loadAll(CountryDAO.java:80)

我的hibernate配置是:

<property name="hibernate.cache.region.factory_class">
        net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
</property>
<property name="hibernate.cache.provider_configuration">
    /ehcache.xml
</property>
<property name="hibernate.cache.use_second_level_cache">
    true
</property>
<property name="hibernate.cache.use_query_cache">
    true
</property>

我的EhCache配置是:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">

<diskStore path="java.io.tmpdir" />

<transactionManagerLookup
    class="net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup"
    properties="jndiName=java:/TransactionManager" propertySeparator=";" />

<cacheManagerEventListenerFactory
    class="" properties="" />

<defaultCache maxElementsInMemory="0" eternal="false"
    overflowToDisk="true" timeToIdleSeconds="1200" timeToLiveSeconds="1200">
</defaultCache>
<cache name="country"
    maxElementsInMemory="300" eternal="false" overflowToDisk="false"
    timeToIdleSeconds="12000" timeToLiveSeconds="12000" diskPersistent="false"
    diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
<cache name="city"
    maxElementsInMemory="300" eternal="false" overflowToDisk="false"
    timeToIdleSeconds="12000" timeToLiveSeconds="12000" diskPersistent="false"
    diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
</ehcache>

我不知道出了什么问题。任何想法?

3 个答案:

答案 0 :(得分:5)

我不知道发生这种情况的实际原因,但我有建议跟踪它。

查看net.sf.ehcache.Cache的源代码,可以看到'alive'检查只检查内存中的标志Cache.cacheStatus。在调试器下运行代码应该很简单,并在Cache.dispose()(状态设置为Status.STATUS_SHUTDOWN)或甚至Cache.CacheStatus.changeState()中设置断点(以捕获任何状态转换)

您可能会发现Hibernate实际上存在错误,或者它可能是您的用法。无论哪种方式,您都应该能够确切地找到将缓存状态更改为“不活动”的人。

祝你好运。

答案 1 :(得分:0)

我不知道hibernate ehcache实现有这个属性,但是当我使用outofbox ehcache解决方案时,我遇到了同样的问题,并在EhCacheManagerFactoryBeanEhCacheCacheManager bean中将共享属性设置为false。 / p>

答案 2 :(得分:0)

我也不知道其实际原因。但我猜测,由于应用程序类路径中存在多个不兼容的EhCache版本,可能会发生这种情况。通过使用以下maven命令检查依赖关系树来检查这一点:

mvn dependency:tree '-Dincludes=*:*cache*'

(PowerShell语法)