2011-10-04 5 views
14

Dopo aver configurato EhCache v2.4.5 come cache di secondo livello per hibernate v3.6.7 viene visualizzato il seguente errore durante il tentativo di caricare tutti gli oggetti di un'entità particolare utilizzando la sessione di sospensione. (Non v'è alcun errore per caricare gli oggetti per la prima volta)EhCache + Hibernate Cache non è attivo

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) 

La mia configurazione 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> 

La mia configurazione 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> 

non ho idea di che cosa sta andando male. qualche idea?

+0

si potrebbe anche impostare la proprietà hibernate.cache.provider_class su net.sf.ehcache.hibernate.EhCacheProvider – frictionlesspulley

+0

C'è un motivo per cui si fa riferimento al file ehcache.xml come "/ehcache.xml", è in ibernazione prendendolo? Se si trovano nello stesso percorso di classe, non è necessario fare riferimento. – artgon

+0

Ho anche provato a EhCacheProvider che esiste lo stesso problema, e riguardo a ehcache.xml avete ragione, l'ibernazione lo preleva così da non arrecare alcun danno sebbene sia ridondante. – Saffar

risposta

4

Non conosco il motivo reale per cui questo sta accadendo, ma ho un suggerimento per rintracciarlo.

Guardando il codice sorgente per net.sf.ehcache.Cache, si può vedere che il controllo "vivo" controlla solo un flag in memoria, Cache.cacheStatus. Dovrebbe essere semplice eseguire il codice sotto il debugger e impostare un punto di interruzione in Cache.dispose() (dove lo stato è impostato su Status.STATUS_SHUTDOWN) o anche su Cache.CacheStatus.changeState() (per rilevare qualsiasi transizione di stato).

Potresti scoprire che in realtà c'è un baco con Hibernate o potrebbe essere il tuo utilizzo. In ogni caso, dovresti essere in grado di trovare esattamente chi cambia lo stato della tua cache in "non vivo".

Buona fortuna.

0

Non so che l'implementazione di ehcache in ibernazione ha questa proprietà ma quando ho usato la soluzione di ehcache di outofbox ho avuto lo stesso problema e risolto con l'impostazione di proprietà condivisa su false nei bean EhCacheManagerFactoryBean o EhCacheCacheManager.