EhCache + Hibernate缓存不存在 [英] EhCache + Hibernate Cache is not alive

查看:186
本文介绍了EhCache + Hibernate缓存不存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  java.lang.IllegalStateException:国家缓存不存在。 
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)
在org.hibernate.loader.Loader.doQuery(Loader.java:857)
在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274 )
在org.hibernate.loader.Loader.doList(Loader.java:2533)
在org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org。 hibernate.loader.Loader。 (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.xsdupdateCheck =true
monitoring =autodetectdynamicConfig =true>

< diskStore path =java.io.tmpdir/>

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

< cacheManagerEventListenerFactory
class =properties =/>

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

我不知道怎么回事。任何想法?

解决方案

我不知道这种情况的真正原因,但我有一个建议, 。



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

您可能会发现Hibernate存在一个错误,或者可能是您的使用。无论采用哪种方式,您都应该能够准确找到谁将缓存状态更改为无法存活。

祝您好运。


After configuring EhCache v2.4.5 as the second level cache for hibernate v3.6.7 I get the following error while trying to load all objects of a particular entity using hibernate session. (There is no error for loading the objects for the first time)

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)

My hibernate configuration is:

<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>

My EhCache configuration is:

<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>

I have no clue what is going wrong. any ideas?

解决方案

I don't know the actual reason why this is happening, but I have a suggestion for tracking it down.

Looking at the source code for net.sf.ehcache.Cache, one can see that the 'alive' check just checks an in-memory flag, Cache.cacheStatus. It should be straightforward to run your code under the debugger, and set a breakpoint either in Cache.dispose() (where status is set to Status.STATUS_SHUTDOWN) or even in Cache.CacheStatus.changeState() (to catch any status transition).

You may find that there is in fact a bug with Hibernate, or it may be your usage. Either way, you should be able to find exactly who's changing the state of your cache to 'not alive'.

Good luck.

这篇关于EhCache + Hibernate缓存不存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆