2009-03-31 16 views
5

Estoy usando hibernate como mi solución ORM, con EHCache como el segundo nivel (lectura-escritura) caché.Manipulación de Hibernate 2nd Level Cache

Mi pregunta es: ¿es posible acceder al caché de segundo nivel directamente?

Quiero tener acceso a esto: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

¿Cómo puedo acceder a la misma ReadWriteCache que está siendo utilizado por Hibernate?

Tengo algunas inserciones JDBC directas/personalizadas que estoy haciendo, y quiero agregar esos objetos a la memoria caché de segundo nivel yo mismo.

Respuesta

6

que yo llamaría "AfterInsert" en la EntityPersister que se asigna a su entidad desde lectura/escritura es una estrategia de concurrencia asíncrona. Lo reconstruí después de mirar a través de la fuente Hibernate 3.3. No estoy al 100% de que esto funcione, pero me parece bien.

EntityPersister persister = ((SessionFactoryImpl) session.getSessionFactory()).getEntityPersister("theNameOfYourEntity"); 

if (persister.hasCache() && 
    !persister.isCacheInvalidationRequired() && 
    session.getCacheMode().isPutEnabled()) { 

    CacheKey ck = new CacheKey( 
        theEntityToBeCached.getId(), 
        persister.getIdentifierType(), 
        persister.getRootEntityName(), 
        session.getEntityMode(), 
        session.getFactory() 
       ); 

    persister.getCacheAccessStrategy().afterInsert(ck, theEntityToBeCached, null); 
} 

-

/** 
* Called after an item has been inserted (after the transaction completes), 
* instead of calling release(). 
* This method is used by "asynchronous" concurrency strategies. 
* 
* @param key The item key 
* @param value The item 
* @param version The item's version value 
* @return Were the contents of the cache actual changed by this operation? 
* @throws CacheException Propogated from underlying {@link org.hibernate.cache.Region} 
*/ 
public boolean afterInsert(Object key, Object value, Object version) throws CacheException; 
1

Hice esto mediante la creación de mi propio proveedor de memoria caché. Simplemente anulé EhCacheProvider y usé mi propia variable para el administrador para poder devolverla de forma estática. Una vez que obtenga el CacheManager, puede llamar a manager.getCache (class_name) para obtener un caché para ese tipo de entidad. A continuación, se construye una CacheKey utilizando la clave principal, el tipo y el nombre de clase:

CacheKey cacheKey = new CacheKey(key, type, class_name, EntityMode.POJO, 
    (SessionFactoryImplementor)session.getSessionFactory()); 

El caché es esencialmente un mapa para que pueda comprobar para ver si el objeto está en la caché, o se puede recorrer las entidades .

Puede haber una manera de acceder al CacheProvider cuando construye SessionFactory inicialmente, lo que evitaría la necesidad de implementar el suyo propio.

0

Tanto Hibernate y JPA ahora proporcionan acceso directo a la memoria caché de segundo nivel subyacente:

sessionFactory.getCache(); 
entityManager.getCache();