2011-10-04 16 views
14

Po skonfigurowaniu EhCache v2.4.5 jako pamięci podręcznej drugiego poziomu dla hibernacji v3.6.7 pojawia się następujący błąd podczas próby załadowania wszystkich obiektów konkretnej jednostki przy użyciu sesji hibernacji. (Nie ma błędu wczytywania obiektów po raz pierwszy)EhCache + Hibernate Cache nie jest żywy

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) 

Moja konfiguracja hibernacji jest:

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

Moja konfiguracja ehcache jest:

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

nie mam pojęcia, co idzie źle. jakieś pomysły?

+0

równie dobrze możesz ustawić właściwość hibernate.cache.provider_class na net.sf.ehcache.hibernate.EhCacheProvider – frictionlesspulley

+0

Czy istnieje powód, dla którego odwołujesz się do pliku ehcache.xml jako "/ehcache.xml", to Hibernate podnosząc to? Jeśli są w tej samej ścieżce klas, nie musisz się do tego odwoływać. – artgon

+0

Próbowałem również EhCacheProvider, ten sam problem istnieje, i o ehcache.xml masz rację, hibernacja podnosi go, więc nie robi żadnej szkody, chociaż jest zbędny. – Saffar

Odpowiedz

4

Nie znam prawdziwego powodu, dla którego tak się dzieje, ale mam sugestię, aby go wyśledzić.

Patrząc na kod źródłowy dla net.sf.ehcache.Cache, widać, że czek "żywy" sprawdza tylko flagę w pamięci, Cache.cacheStatus. Powinno być proste uruchomienie kodu pod debuggerem i ustawienie punktu przerwania w Cache.dispose() (gdzie status jest ustawiony na Status.STATUS_SHUTDOWN) lub nawet w Cache.CacheStatus.changeState() (w celu przechwycenia dowolnego przejścia statusu).

Może się zdarzyć, że rzeczywiście wystąpił błąd w Hibernate lub może to być Twoje użycie. Tak czy inaczej, powinieneś być w stanie dokładnie określić, kto zmienia stan twojej pamięci podręcznej na "nieżywy".

Powodzenia.

0

Nie wiem, czy implementacja ehcache hibernacji ma tę właściwość, ale kiedy użyłem rozwiązania outfbox ehcache, mam ten sam problem i rozwiązano go przy ustawianiu właściwości wspólnej na false w komponentach EhCacheManagerFactoryBean lub EhCacheCacheManager.