2009-03-31 18 views
5

Używam hibernacji jako mojego rozwiązania ORM, z EHCache jako pamięci podręcznej drugiego poziomu (odczyt-zapis).Manipulacja hibernacji Pamięć podręczna drugiego poziomu

Moje pytanie brzmi: Czy można uzyskać bezpośredni dostęp do pamięci podręcznej drugiego poziomu?

Chcę uzyskać dostęp do tego: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

Jak mogę uzyskać dostęp do tego samego ReadWriteCache, który jest używany przez Hibernate?

Mam niektóre bezpośrednie/niestandardowe wstawki JDBC, które robię, i chcę dodać te obiekty do pamięci podręcznej drugiego poziomu samodzielnie.

Odpowiedz

6

nazwałbym „afterInsert” na EntityPersister który mapuje do podmiotu od odczytu/zapisu jest asynchroniczny strategia współbieżności. Poskładałem to razem po przejrzeniu źródła Hibernate 3.3. Nie jestem w 100%, że to zadziała, ale wygląda mi dobrze.

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

Zrobiłem to tworząc własną operatorem cache. Właśnie przekroczyłem EhCacheProvider i użyłem własnej zmiennej dla menedżera, więc mogłem ją zwrócić statycznie. Po uzyskaniu CacheManagera, możesz wywołać manager.getCache (nazwa_klasy), aby uzyskać pamięć podręczną dla tego typu jednostki. Następnie należy zbudować CacheKey pomocą klucza podstawowego, rodzaj i nazwę klasy:

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

Bufor jest zasadniczo map, dzięki czemu można sprawdzić, czy obiekt jest w pamięci podręcznej, lub iterację podmiotów .

Może istnieć sposób dostępu do CacheProvider podczas budowania SessionFactory początkowo, co pozwoliłoby uniknąć konieczności implementacji własnego.

0

Zarówno hibernacji i WZP teraz zapewniają bezpośredni dostęp do podstawowej pamięci podręcznej poziom 2:

sessionFactory.getCache(); 
entityManager.getCache(); 
Powiązane problemy