2010-05-27 15 views
5

Sto cercando di ottenere un cache di ibernazione di secondo livello funzionante, utilizzando l'implementazione di ehcache.hibernate di secondo livello ehcache miss

Sono sicuro che si tratta di un errore evidente che sto facendo, ma non riesco a vedere cosa sia!

per testare la cache, sto facendo la seguente:

Creazione di un oggetto e salvarlo. L'ho preso una volta all'interno della transazione, dove posso vedere che ottengo l'oggetto indietro senza un hit db, che è solo la cache di primo livello in ibernazione che fa il suo dovere.

Quindi impegno la transazione e avvio una nuova sessione.

Questa volta, quando ottengo l'oggetto, posso vedere una mancanza di cache da ehcache nei debug. Mi sarei aspettato che l'oggetto fosse nella cache ora da quando l'ho salvato nella transazione precedente?

Ecco il mio codice:

Session session = getSession(); 
    session.beginTransaction(); 

    Test1 test1a = new Test1(); 
    test1a.setId(5); 
    test1a.setName("Test 1"); 
    test1a.setValue(10); 
    // Touch it 
    session.save(test1a); 

    // Now get it 
    Test1 test1b = (Test1)session.get(Test1.class, 5); 

    // Within a transaction, the session caches it - no db hit 
    System.out.println("GOT object with value "+test1b.getValue()); 

    session.getTransaction().commit(); 

    System.out.println("Between sessions"); 

    session = getSession(); 
    session.beginTransaction(); 

    test1b = (Test1)session.get(Test1.class, 5); 

    System.out.println("GOT object with value "+test1b.getValue()); 

    session.getTransaction().commit(); 

Ed ecco la parte rilevante della mia hibernate.cfg.xml

<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

E il mio ehcache.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="http://ehcache.sf.net/ehcache.xsd"> 
    <cache name="com.play.hibernate1.Test1" maxElementsInMemory="1000" eternal="false"  timeToLiveSeconds="600" overflowToDisk="false"/> 
    <defaultCache maxElementsInMemory="10000" eternal="false" 
overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20" diskPersistent="true" /> 
    </ehcache> 

E le mie annotazioni

@Entity 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class Test1 { 

E il debug di registri

 
11:21:03,474 DEBUG CacheManager:239 - Configuring ehcache from classpath. 
11:21:03,479 DEBUG ConfigurationFactory:122 - Configuring ehcache from ehcache.xml found in the classpath: file:/Users/bw/Documents/workspace/hibernate1/target/classes/ehcache.xml 
11:21:03,479 DEBUG ConfigurationFactory:87 - Configuring ehcache from URL: file:/Users/brucewood/Documents/workspace/hibernate1/target/classes/ehcache.xml 
11:21:03,480 DEBUG ConfigurationFactory:139 - Configuring ehcache from InputStream 
11:21:03,485 DEBUG BeanHandler:213 - Ignoring ehcache attribute xmlns:xsi 
11:21:03,485 DEBUG BeanHandler:213 - Ignoring ehcache attribute xsi:noNamespaceSchemaLocation 
11:21:03,517 DEBUG ConfigurationHelper:208 - No CacheManagerEventListenerFactory class specified. Skipping... 
11:21:03,518 DEBUG ConfigurationHelper:183 - No CachePeerListenerFactoryConfiguration specified. Not configuring a CacheManagerPeerListener. 
11:21:03,518 DEBUG ConfigurationHelper:159 - No CachePeerProviderFactoryConfiguration specified. Not configuring a CacheManagerPeerProvider. 
11:21:03,525 DEBUG ConfigurationHelper:135 - No BootstrapCacheLoaderFactory class specified. Skipping... 
11:21:03,526 DEBUG ConfigurationHelper:135 - No BootstrapCacheLoaderFactory class specified. Skipping... 
11:21:03,532 DEBUG MemoryStore:73 - Initialized net.sf.ehcache.store.LruMemoryStore for com.play.hibernate1.Test1 
11:21:03,533 DEBUG LruMemoryStore:71 - com.play.hibernate1.Test1 Cache: Using SpoolingLinkedHashMap implementation 
11:21:03,533 DEBUG Cache:429 - Initialised cache: com.play.hibernate1.Test1 
1528 [Finalizer] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost:3306/play 
1668 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured 
GOT object with value 10 
Hibernate: 
    /* insert com.play.hibernate1.Test1 
     */ insert 
     into 
      Test1 
      (name, value, id) 
     values 
      (?, ?, ?) 
1274984463818|1|1|batch|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5) 
1274984463820|1|1|statement|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5) 
1274984463821|1|1|commit|| 
Between sessions 
11:21:03,823 DEBUG EhCache:68 - key: com.play.hibernate1.Test1#5 
11:21:03,823 DEBUG MemoryStore:138 - com.play.hibernate1.Test1Cache: com.play.hibernate1.Test1MemoryStore miss for com.play.hibernate1.Test1#5 
11:21:03,823 DEBUG Cache:661 - com.play.hibernate1.Test1 cache - Miss 
11:21:03,824 DEBUG EhCache:77 - Element for com.play.hibernate1.Test1#5 is null 
Hibernate: 
    /* load com.play.hibernate1.Test1 */ select 
     test1x0_.id as id0_0_, 
     test1x0_.name as name0_0_, 
     test1x0_.value as value0_0_ 
    from 
     Test1 test1x0_ 
    where 
     test1x0_.id=? 
1274984463829|4|1|statement|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=?|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=5 
1274984463831|-1||resultset|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=5|name0_0_ = Test 1, value0_0_ = 10 
GOT object with value 10 
1274984463834|0|1|commit|| 

Grazie per il vostro aiuto!

+0

Finora ho anche l'ho tracciato al salvataggio iniziale - posso vedere che non è nella cache dopo. Tuttavia, è nella cache dopo averlo recuperato dal database e quindi posso recuperarlo dalla cache. Quindi sembra che il mio salvataggio non lo metta nella cache. – Jeremy

risposta

7

Il problema era che stavo usando NONSTRICT_READ_WRITE. Sembrava per adattarsi al disegno di legge da questa spiegazione nella documentazione:

Se l'applicazione solo di tanto in tanto deve modificare i dati (ad esempio se si tratta di estremamente improbabile che due transazioni avrebbero cercato di aggiornare lo stesso articolo contemporaneamente) e non è richiesto il rigoroso isolamento della transazione , una cache non scritta di lettura-scrittura potrebbe essere appropriata. Se la cache viene utilizzata in un ambiente JTA , è necessario specificare hibernate.transaction.manager_lookup_class. In altri ambienti, è necessario assicurarsi che la transazione sia completata quando Session.close() o Session.disconnect() viene chiamato.

ma in realtà sembra che non aggiunga oggetti salvati alla cache .. I documenti sono un po 'sottili qui, IMO. C'è un trattamento migliore delle opzioni di memorizzazione nella cache in Persistenza di Java con Hibernate, anche se ancora un po 'sottile sulla spiegazione concreta di ciò che effettivamente accade ai tuoi dati. Ad ogni modo ..

Ho cambiato la mia opzione di caching in READ_WRITE, e ora funziona come previsto.

Si noti inoltre che la prima volta che un oggetto viene aggiunto alla cache, si ottiene un "errore di cache" nei debug di ehcache.Presumibilmente sembra nella sua cache, trova l'oggetto non è lì, registra un miss, quindi aggiunge l'oggetto. Dopo ciò, ottieni "successi".

+0

+2 per la domanda e la risposta –

Problemi correlati