Tytuł oczywiście stwierdza: Nie mogę sprawić, aby pamięć podręczna drugiego poziomu działała dla JPA2/Hibernate 3.6.3.Przykład pracy z Hibernate 3.6.2 Cache drugiego poziomu z JPA2?
Próbowałem wielu hack, aby to działało. Ale udało mi się tylko uruchomić pamięć podręczną zapytań. Chociaż Hibernuj tworzy pamięć podręczną (nazwę instancji), są one ignorowane. Nawet pomyłki nie są rejestrowane. Może to niezgodność wersji. Próbowałem innych bez rezultatu. I już nie czuję się na siłach, aby wypróbować wszystkie permutacje. :-P
Zadaję tu pytanie, ponieważ niektórzy ludzie wydają się działać (których przykłady próbowałem również). Może dostrzegą oczywisty błąd, który popełniam.
Z góry dziękuję wszystkim, którzy mi pomagają! :-)
persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="foo" transaction-type="RESOURCE_LOCAL">
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:derby:/opt/db/foo;create=true"/>
<property name="javax.persistence.jdbc.user" value="foo"/>
<property name="javax.persistence.jdbc.password" value="bar"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
</properties>
</persistence-unit>
pom.xml
setup<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.4.2</version>
JMX
W ten sposób mogę sprawdzić użycie pamięci podręcznych. Bufory są tworzone (po jednym dla każdej jednostki) i znajdują się tam również dwie pamięci podręczne zapytań. Te ostatnie zapełniają się dość szybko. Ale żadna z pamięci podręcznych nie wykazuje żadnych błędów ani trafień. Nawet pamięć podręczna zapytań.
ManagementService.registerMBeans(CacheManager.getInstance(), ManagementFactory.getPlatformMBeanServer(), true, true, true, true, true)
Pamięć podręczna encji jest ignorowana. Powinny zawierać co najmniej jednostki, które są zapisywane w bazie danych. Lub pobierane z zapytaniami. Nic się tam nie porusza.
próbka kodu Java
EntityManager entityManager = Persistence.createEntityManagerFactory("foo").createEntityManager();
entityManager.getTransaction.begin();
entityManager.merge(bar);
entityManager.getTransaction.commit();
Query query = entityManager.createQuery("select b from Bar p where b.name = :name");
query.setParameter("name", "fooBar");
query.setHint("org.hibernate.cacheable","true");
query.getSingleResult();
Przejęcie działa - bo nie ma danych do bazy danych. A znalezisko działa, ponieważ otrzymuję obiekty z wygenerowanymi identyfikatorami.
Ankietowane jednostki są indeksowane w bazie danych.
WHODUNNIT?
Czy rzeczywiście oznaczyłeś swoje podmioty jako @Cacheable? –
Tak. I odpowiednie wyskakujące okienka podręczne w JMX. Tylko encje nie są buforowane podczas kwerendy. Nie w przypadku uporczywości/łączenia. –