2010-05-27 16 views
5

Estoy intentando obtener un caché de hibernación de segundo nivel funcionando, usando la implementación de ehcache.hibernate de segundo nivel ehcache miss

Estoy seguro de que es un obvio error novato que estoy cometiendo, ¡pero no puedo ver de qué se trata!

Para probar mi caché, estoy haciendo lo siguiente:

Creación de un objeto y guardarlo. Lo 'recibo' una vez dentro de la transacción, donde puedo ver que recupero el objeto sin un golpe de DB, que es solo el caché de hibernación de primer nivel que está haciendo su trabajo.

Luego comprometo la transacción y comienzo una nueva sesión.

Esta vez, cuando 'consigo' el objeto, puedo ver un error de caché de ehcache en los errores. Hubiera esperado que el objeto estuviera en el caché ahora, ya que lo guardé en la transacción anterior.

Aquí está mi código:

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(); 

y aquí está la parte pertinente de mi hibernate.cfg.xml

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

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

Y mis anotaciones

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

Y el registros de depuración

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

Gracias por su ayuda!

+0

Hasta ahora he lo rastreó al guardado inicial - Puedo ver que no está en el caché después de eso. Sin embargo, ESTÁ en el caché después de que lo recupere de la base de datos, y luego puedo recuperarlo del caché. Entonces parece que mi salvación no es ponerlo en el caché. – Jeremy

Respuesta

7

El problema era que estaba usando NONSTRICT_READ_WRITE. Parecía que se ajustaba perfectamente a esta explicación en la documentación:

Si la aplicación sólo de vez en cuando necesidades para actualizar los datos (es decir, si se trata de muy poco probable que dos transacciones tratarían de actualizar el mismo artículo simultáneamente), y no es necesario el estricto aislamiento de transacción , un caché de lectura no restringida podría ser apropiado. Si la caché se usa en un entorno JTA , debe especificar hibernate.transaction.manager_lookup_class. En otros entornos, debe asegurarse de que la transacción sea completada cuando se llama a Session.close() o Session.disconnect().

pero en realidad parece que no agrega objetos guardados a la caché ... Los documentos son un poco delgados aquí, IMO. Hay un mejor tratamiento de las opciones de almacenamiento en caché en Java Persistence con Hibernate, aunque todavía es un poco escaso en la explicación concreta de lo que realmente sucede con sus datos. De todos modos ..

Cambié mi opción de almacenamiento en caché a READ_WRITE, y ahora funciona como se esperaba.

Tenga en cuenta también que la primera vez que un objeto se agrega a la memoria caché, se obtiene una "falta de memoria caché" en los errores de ehcache.Presumiblemente, busca en su memoria caché, descubre que el objeto no está allí, registra una falla y luego agrega el objeto. Después de eso, obtienes 'hits'.

+0

+2 para la pregunta y la respuesta –

Cuestiones relacionadas