2009-03-31 7 views
5

J'utilise hibernate comme solution ORM, avec EHCache comme cache de second niveau (lecture-écriture).Manipulation du cache de second niveau Hibernate

Ma question est: Est-il possible d'accéder directement au cache de second niveau?

Je veux y accéder: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

Comment puis-je accéder à la même ReadWriteCache qui est utilisé par Hibernate?

J'ai quelques insertions JDBC directes/personnalisées que je fais, et je veux ajouter ces objets au cache de 2ème niveau moi-même.

Répondre

6

je qualifierais de « AfterInsert » sur la EntityPersister qui correspond à votre entité depuis lecture/écriture est une stratégie asynchrone concurrency. J'ai reconstitué ceci ensemble après avoir regardé à travers la source d'Hibernate 3.3. Je ne suis pas à 100% que ça va marcher, mais ça me va 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

Je l'ai fait en créant mon propre fournisseur de cache. Je viens de remplacer EhCacheProvider et utilisé ma propre variable pour le gestionnaire afin que je puisse le renvoyer dans un static. Une fois que vous obtenez le CacheManager, vous pouvez appeler manager.getCache (class_name) pour obtenir un cache pour ce type d'entité. Ensuite, vous construisez une CacheKey en utilisant la clé primaire, le type et le nom de classe:

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

Le cache est essentiellement une carte de sorte que vous pouvez vérifier si votre objet est dans le cache, ou itérer les entités .

Il existe peut-être un moyen d'accéder au CacheProvider lorsque vous créez initialement le SessionFactory, ce qui évite d'avoir à implémenter le vôtre.

0

Les deux mise en veille prolongée et JPA offrent désormais un accès direct au cache 2ème niveau sous-jacent:

sessionFactory.getCache(); 
entityManager.getCache(); 
Questions connexes