问题
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?
回答1:
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.
回答2:
I don't know hibernate ehcache implementation has this property but when i used outofbox solution of ehcache i got same problem and solved with setting up shared property to false in EhCacheManagerFactoryBean
or EhCacheCacheManager
beans.
回答3:
I don't know the actual reason either. But I have a guess that it may happen due to multiple incompatible versions of EhCache in application classpath. Check this by inspecting dependency tree with the following maven command:
mvn dependency:tree '-Dincludes=*:*cache*'
(PowerShell syntax)
来源:https://stackoverflow.com/questions/7646651/ehcache-hibernate-cache-is-not-alive